Subversion Repositories SvarDOS

Rev

Rev 593 | Rev 606 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 593 Rev 603
Line 26... Line 26...
26
 
26
 
27
#include <stdio.h>
27
#include <stdio.h>
28
#include <stdlib.h> /* atoi() */
28
#include <stdlib.h> /* atoi() */
29
#include <string.h> /* strchr */
29
#include <string.h> /* strchr */
30
 
30
 
-
 
31
#include "svarlang.lib/svarlang.h"
-
 
32
 
31
#include "country.h"
33
#include "country.h"
32
 
34
 
33
#define PVER "20220202"
35
#define PVER "20220203"
34
#define PDATE "2015-2022"
36
#define PDATE "2015-2022"
35
 
37
 
36
 
38
 
-
 
39
enum NLS_STRINGS {
-
 
40
  NLS_HLP_VER           = 0x0000,
-
 
41
  NLS_HLP_DESC          = 0x0001,
-
 
42
  NLS_HLP_USAGE         = 0x0002,
-
 
43
  NLS_HLP_OPTIONS       = 0x0003,
-
 
44
  NLS_HLP_COUNTRY       = 0x000A,
-
 
45
  NLS_HLP_CP            = 0x000B,
-
 
46
  NLS_HLP_DECIM         = 0x000C,
-
 
47
  NLS_HLP_THOUS         = 0x000D,
-
 
48
  NLS_HLP_DATESEP       = 0x000E,
-
 
49
  NLS_HLP_DATEFMT       = 0x000F,
-
 
50
  NLS_HLP_TIMESEP       = 0x0010,
-
 
51
  NLS_HLP_TIMEFMT       = 0x0011,
-
 
52
  NLS_HLP_CURR          = 0x0012,
-
 
53
  NLS_HLP_CURRPOS0      = 0x0013,
-
 
54
  NLS_HLP_CURRPOS1      = 0x0014,
-
 
55
  NLS_HLP_CURRPOS2      = 0x0015,
-
 
56
  NLS_HLP_CURRSPC       = 0x0016,
-
 
57
  NLS_HLP_CURRPREC      = 0x0017,
-
 
58
  NLS_HLP_YESNO         = 0x0018,
-
 
59
  NLS_HLP_INFOLOC1      = 0x0032,
-
 
60
  NLS_HLP_INFOLOC2      = 0x0033,
-
 
61
 
-
 
62
  NLS_INFO_COUNTRY      = 0x0700,
-
 
63
  NLS_INFO_CODEPAGE     = 0x0701,
-
 
64
  NLS_INFO_DECSEP       = 0x0702,
-
 
65
  NLS_INFO_THOUSEP      = 0x0703,
-
 
66
  NLS_INFO_DATEFMT      = 0x0704,
-
 
67
  NLS_INFO_TIMEFMT      = 0x0705,
-
 
68
  NLS_INFO_YESNO        = 0x0706,
-
 
69
  NLS_INFO_CURREXAMPLE  = 0x0707,
-
 
70
  NLS_MAKESURE          = 0x0709,
-
 
71
 
-
 
72
  NLS_ERR_FILEPATHTWICE = 0x0900,
-
 
73
  NLS_ERR_BADPATH       = 0x0901,
-
 
74
  NLS_ERR_READFAIL      = 0x0902,
-
 
75
  NLS_ERR_INVPARAM      = 0x0903
-
 
76
};
-
 
77
 
-
 
78
 
-
 
79
static void nls_puts(enum NLS_STRINGS id) {
-
 
80
  puts(svarlang_strid(id));
-
 
81
}
-
 
82
 
-
 
83
 
-
 
84
static void nls_put(enum NLS_STRINGS id) {
-
 
85
  printf("%s", svarlang_strid(id));
-
 
86
}
-
 
87
 
-
 
88
 
-
 
89
static void crlf(void) {
-
 
90
  puts("");
-
 
91
}
-
 
92
 
-
 
93
 
37
static void about(void) {
94
static void about(void) {
38
  puts("localcfg ver " PVER " - locales configuration for DOS\n"
95
  printf("localcfg ");
-
 
96
  nls_put(NLS_HLP_VER);
39
       "Copyright (C) " PDATE " Mateusz Viste\n"
97
  puts(" " PVER ", (C) " PDATE " Mateusz Viste");
40
       "\n"
98
  crlf();
41
       "localcfg creates or edits a custom COUNTRY.SYS-like file with your preferences.\n"
99
  nls_puts(NLS_HLP_DESC);
42
       "\n"
100
  crlf();
43
       "usage: localcfg [COUNTRY.SYS] [options]\n"
101
  nls_puts(NLS_HLP_USAGE);
44
       "\n"
102
  crlf();
45
       "options allow to configure country locales to your likening, as follows:\n"
103
  nls_puts(NLS_HLP_OPTIONS);
-
 
104
  crlf();
46
       "  /country:XX indicates your country code is XX (1 for USA, 33 for France, etc)\n"
105
  nls_puts(NLS_HLP_COUNTRY);
47
       "  /cp:XXX     adapts country data for codepage XXX (example: '437')\n"
106
  nls_puts(NLS_HLP_CP);
48
       "  /decim:X    reconfigures the decimal symbol to be 'X'");
107
  nls_puts(NLS_HLP_DECIM);
49
  puts("  /thous:X    reconfigures the thousands symbol to be 'X'\n"
108
  nls_puts(NLS_HLP_THOUS);
50
       "  /datesep:X  sets the date separator to 'X' (for example '/')\n"
109
  nls_puts(NLS_HLP_DATESEP);
51
       "  /datefmt:X  sets the date format, can be: MDY, DMY or YMD\n"
110
  nls_puts(NLS_HLP_DATEFMT);
52
       "  /timesep:X  sets the time separator to 'X' (for example ':')\n"
111
  nls_puts(NLS_HLP_TIMESEP);
53
       "  /timefmt:X  sets the time format: 0=12h with AM/PM or 1=24h\n"
112
  nls_puts(NLS_HLP_TIMEFMT);
54
       "  /curr:XXX   sets the currency to XXX (a string of 1 to 4 characters)\n"
113
  nls_puts(NLS_HLP_CURR);
55
       "  /currpos:X  sets the currency symbol position to X, where X is either");
114
  nls_puts(NLS_HLP_CURRPOS0);
56
  puts("              0=currency precedes the value, 1=currency follows the value and\n"
115
  nls_puts(NLS_HLP_CURRPOS1);
57
       "              2=currency replaces the decimal sign\n"
116
  nls_puts(NLS_HLP_CURRPOS2);
58
       "  /currspc:X  space between the currency and the value (0=no, 1=yes)\n"
117
  nls_puts(NLS_HLP_CURRSPC);
59
       "  /currprec:X currency's precision (number of decimal digits, 0..9)\n"
118
  nls_puts(NLS_HLP_CURRPREC);
60
       "  /yesno:XY   sets the 'Yes/No' letter to XY (default: YN)\n"
119
  nls_puts(NLS_HLP_YESNO);
61
       "\n"
120
  crlf();
62
       "If COUNTRY.SYS location is not provided, then localcfg tries loading it\n"
-
 
63
       "from %DOSDIR%\\CFG\\COUNTRY.SYS\n"
121
  nls_puts(NLS_HLP_INFOLOC1);
64
      );
122
  nls_puts(NLS_HLP_INFOLOC2);
65
}
123
}
66
 
124
 
67
 
125
 
68
static char *datestring(struct country *c) {
126
static char *datestring(struct country *c) {
69
  static char result[16];
127
  static char result[16];
Line 301... Line 359...
301
  struct country cntdata;
359
  struct country cntdata;
302
  int changedflag;
360
  int changedflag;
303
  int x;
361
  int x;
304
  static char fname[130];
362
  static char fname[130];
305
 
363
 
-
 
364
  svarlang_autoload("localcfg");
-
 
365
 
306
  /* scan argv looking for the path to country.sys */
366
  /* scan argv looking for the path to country.sys */
307
  for (x = 1; x < argc; x++) {
367
  for (x = 1; x < argc; x++) {
308
    if (argv[x][0] != '/') {
368
    if (argv[x][0] != '/') {
309
      if (fname[0] != 0) {
369
      if (fname[0] != 0) {
310
        puts("ERROR: file path can be provided only once");
370
        nls_puts(NLS_ERR_FILEPATHTWICE);
311
        return(1);
371
        return(1);
312
      }
372
      }
313
      /* */
373
      /* */
314
      if (file_truename(fname, argv[x]) != 0) {
374
      if (file_truename(fname, argv[x]) != 0) {
315
        puts("ERROR: bad file path");
375
        nls_puts(NLS_ERR_BADPATH);
316
        return(1);
376
        return(1);
317
      }
377
      }
318
    } else if (strcmp(argv[x], "/?") == 0) { /* is it /? */
378
    } else if (strcmp(argv[x], "/?") == 0) { /* is it /? */
319
      about();
379
      about();
320
      return(1);
380
      return(1);
Line 324... Line 384...
324
  /* if no file path provided, look into %DOSDIR%\CFG\COUNTRY.SYS */
384
  /* if no file path provided, look into %DOSDIR%\CFG\COUNTRY.SYS */
325
  if (fname[0] == 0) default_country_path(fname);
385
  if (fname[0] == 0) default_country_path(fname);
326
 
386
 
327
  x = country_read(&cntdata, fname);
387
  x = country_read(&cntdata, fname);
328
  if (x != 0) {
388
  if (x != 0) {
329
    printf("ERROR: failed to read the preference file [%d]\n", x);
389
    nls_puts(NLS_ERR_READFAIL);
330
    return(2);
390
    return(2);
331
  }
391
  }
332
 
392
 
333
  changedflag = 0;
393
  changedflag = 0;
334
 
394
 
335
  /* process command line arguments */
395
  /* process command line arguments */
336
  for (x = 1; x < argc; x++) {
396
  for (x = 1; x < argc; x++) {
337
    if (argv[x][0] != '/') continue; /* skip country.sys filename (processed earlier) */
397
    if (argv[x][0] != '/') continue; /* skip country.sys filename (processed earlier) */
338
    changedflag++;
398
    changedflag++;
339
    if (processarg(argv[x], &cntdata) != 0) {
399
    if (processarg(argv[x], &cntdata) != 0) {
340
      puts("ERROR: invalid parameter syntax");
400
      nls_puts(NLS_ERR_INVPARAM);
341
      return(3);
401
      return(3);
342
    }
402
    }
343
  }
403
  }
344
 
404
 
-
 
405
  nls_put(NLS_INFO_COUNTRY);
345
  printf("Country intl code.....: %03d\n", cntdata.CTYINFO.id);
406
  printf(" %03d\r\n", cntdata.CTYINFO.id);
-
 
407
  nls_put(NLS_INFO_CODEPAGE);
346
  printf("Codepage..............: %d\n", cntdata.CTYINFO.codepage);
408
  printf(" %d\r\n", cntdata.CTYINFO.codepage);
-
 
409
  nls_put(NLS_INFO_DECSEP);
347
  printf("Decimal separator.....: %c\n", cntdata.CTYINFO.decimal[0]);
410
  printf(" %c\r\n", cntdata.CTYINFO.decimal[0]);
-
 
411
  nls_put(NLS_INFO_THOUSEP);
348
  printf("Thousands separator...: %c\n", cntdata.CTYINFO.thousands[0]);
412
  printf(" %c\r\n", cntdata.CTYINFO.thousands[0]);
-
 
413
  nls_put(NLS_INFO_DATEFMT);
349
  printf("Date format...........: %s\n", datestring(&cntdata));
414
  printf(" %s\r\n", datestring(&cntdata));
-
 
415
  nls_put(NLS_INFO_TIMEFMT);
350
  printf("Time format...........: %s\n", timestring(&cntdata));
416
  printf(" %s\r\n", timestring(&cntdata));
-
 
417
  nls_put(NLS_INFO_YESNO);
351
  printf("Yes/No letters........: %c/%c\n", cntdata.YESNO.yes[0], cntdata.YESNO.no[0]);
418
  printf(" %c/%c\r\n", cntdata.YESNO.yes[0], cntdata.YESNO.no[0]);
-
 
419
  nls_put(NLS_INFO_CURREXAMPLE);
352
  printf("Currency example......: %s\n", currencystring(&cntdata));
420
  printf(" %s\r\n", currencystring(&cntdata));
353
 
421
 
354
  printf("\n"
422
  crlf();
355
         "Make sure that your CONFIG.SYS contains this directive:\n"
423
  nls_puts(NLS_MAKESURE);
356
         "COUNTRY=%03d,%03d,%s\n\n", cntdata.CTYINFO.id, cntdata.CTYINFO.codepage, fname);
424
  printf("COUNTRY=%03d,%03d,%s", cntdata.CTYINFO.id, cntdata.CTYINFO.codepage, fname);
-
 
425
  crlf();
357
 
426
 
358
  /* if anything changed, write the new file */
427
  /* if anything changed, write the new file */
359
  if (changedflag != 0) country_write(fname, &cntdata);
428
  if (changedflag != 0) country_write(fname, &cntdata);
360
 
429
 
361
  return(0);
430
  return(0);