• R/O
  • SSH
  • HTTPS

svardos: Commit


Commit MetaInfo

Revision612 (tree)
Time2022-02-04 01:16:26
Authormateuszviste

Log Message

frozen ver 20220203 to tags

Change Summary

Incremental Difference

--- localcfg/tags/20220203/nls_lang/en.txt (nonexistent)
+++ localcfg/tags/20220203/nls_lang/en.txt (revision 612)
@@ -0,0 +1,55 @@
1+#
2+# LOCALCFG TRANSLATION FILE
3+#
4+# LANGUAGE: ENGLISH
5+# TRANSLATOR: MATEUSZ VISTE
6+#
7+
8+### HELP SCREEN ###########################################################
9+
10+0.0:version
11+0.1:creates or edits COUNTRY.SYS local preferences
12+0.2:usage: localcfg [COUNTRY.SYS] [options]
13+0.3:options:
14+
15+0.10:/country:XX set the country code to XX (1=USA, 33=France, 48=Poland, etc)
16+0.11:/cp:XXX adapts country data for codepage XXX (example: '437')
17+0.12:/decim:X reconfigures the decimal symbol to be 'X'
18+0.13:/thous:X reconfigures the thousands symbol to be 'X'
19+0.14:/datesep:X sets the date separator to 'X' (for example '/')
20+0.15:/datefmt:X sets the date format, can be: MDY, DMY or YMD
21+0.16:/timesep:X sets the time separator to 'X' (for example ':')
22+0.17:/timefmt:X sets the time format: 0=12h with AM/PM or 1=24h
23+0.18:/curr:XXX sets the currency to XXX (a string of 1 to 4 characters)
24+0.19:/currpos:X sets the currency symbol position to X, where X is either
25+0.20: 0=currency precedes the value, 1=currency follows the value and
26+0.21: 2=currency replaces the decimal sign
27+0.22:/currspc:X space between the currency and the value (0=no, 1=yes)
28+0.23:/currprec:X currency's precision (number of decimal digits, 0..9)
29+0.24:/yesno:XY sets the 'Yes/No' letter to XY (default: YN)
30+
31+0.50:If COUNTRY.SYS location is not provided, then localcfg tries loading it
32+0.51:from %DOSDIR%\CFG\COUNTRY.SYS
33+
34+
35+### INFO SCREEN ###########################################################
36+
37+7.0:Country code.......:
38+7.1:Codepage...........:
39+7.2:Decimal separator..:
40+7.3:Thousands separator:
41+7.4:Date format........:
42+7.5:Time format........:
43+7.6:Yes/No characters..:
44+7.7:Currency example...:
45+
46+7.9:Make sure that your CONFIG.SYS contains this directive:
47+
48+### ERROR MESSAGES ########################################################
49+
50+9.0:ERROR: file path can be provided only once
51+9.1:ERROR: bad path to file
52+9.2:ERROR: failed to read the file
53+9.3:ERROR: invalid parameter syntax
54+9.4:ERROR: the file is not a valid COUNTRY.SYS
55+9.5:ERROR: the file has not been created with LOCALCFG
--- localcfg/tags/20220203/nls_lang/pl_utf8.txt (nonexistent)
+++ localcfg/tags/20220203/nls_lang/pl_utf8.txt (revision 612)
@@ -0,0 +1,55 @@
1+#
2+# LOCALCFG TRANSLATION FILE
3+#
4+# LANGUAGE: POLISH
5+# TRANSLATOR: MATEUSZ VISTE
6+#
7+
8+### HELP SCREEN ###########################################################
9+
10+0.0:wersja
11+0.1:tworzy lub zmienia lokalne preferencje COUNTRY.SYS
12+0.2:użycie: localcfg [COUNTRY.SYS] [opcje]
13+0.3:opcje:
14+
15+0.10:/country:XX ustawia kod kraju na XX (1=USA, 33=Francja, 48=Polska, itd)
16+0.11:/cp:XXX ustawia preferowaną stronę kodową na XXX (przykład: '437')
17+0.12:/decim:X ustawia separator dziesiętny 'X'
18+0.13:/thous:X ustawia separator tysięczny 'X'
19+0.14:/datesep:X ustawia separator daty 'X' (np. '/')
20+0.15:/datefmt:X ustawia jeden z formatów daty: MDY, DMY lub YMD
21+0.16:/timesep:X ustawia separator czasu 'X' (np. ':')
22+0.17:/timefmt:X ustawia format godziny: 0=12h z AM/PM lub 1=24h
23+0.18:/curr:XXX ustawia walutę XXX (ciąg od 1 do 4 znaków)
24+0.19:/currpos:X ustawia miejsce symbolu walutowego, gdzie X może być:
25+0.20: 0=symbol waluty przed sumą, 1=symbol waluty po sumie,
26+0.21: 2=symbol waluty zastępuje znak dziesiętny
27+0.22:/currspc:X spacja pomiędzy walutą a wartością (0=nie, 1=tak)
28+0.23:/currprec:X dokładność waluty (liczba pozycji dziesiętnych, 0..9)
29+0.24:/yesno:XY ustawia znaki 'Tak/Nie' (domyślnie: YN)
30+
31+0.50:Jeśli nie podasz ścieżki do COUNTRY.SYS to localcfg spróbuje załadować plik
32+0.51:%DOSDIR%\CFG\COUNTRY.SYS
33+
34+
35+### INFO SCREEN ###########################################################
36+
37+7.0:Kod kraju..........:
38+7.1:Strona kodowa......:
39+7.2:Znak dziesiętny....:
40+7.3:Separator tysięczny:
41+7.4:Format daty........:
42+7.5:Format godziny.....:
43+7.6:Znaki Tak/Nie......:
44+7.7:Przykład waluty....:
45+
46+7.9:Upewnij się, że twój plik CONFIG.SYS zawiera taki wpis:
47+
48+### ERROR MESSAGES ########################################################
49+
50+9.0:BŁĄD: ścieżka do pliku może zostać podana tylko raz
51+9.1:BŁĄD: zła ścieżka do pliku
52+9.2:BŁĄD: nie zdołano wczytać pliku
53+9.3:BŁĄD: nieprawidłowa składnia parametru
54+9.4:BŁĄD: plik nie jest prawidłowym plikiem COUNTRY.SYS
55+9.5:BŁĄD: plik nie został stworzony za pomocą LOCALCFG
--- localcfg/tags/20220203/Makefile (nonexistent)
+++ localcfg/tags/20220203/Makefile (revision 612)
@@ -0,0 +1,58 @@
1+#
2+# localcfg Makefile for OpenWatcom
3+#
4+
5+all: localcfg.com
6+
7+localcfg.com: localcfg.c country.c deflang.c
8+ wcl -0 -y -cc -wx -mt -lr -zp1 -we -d0 -ox localcfg.c country.c deflang.c svarlang.lib/svarlngs.lib
9+ del *.obj
10+ upx --8086 -9 localcfg.com
11+
12+deflang.c: nls_lang\*.txt
13+ cd nls_lang
14+ utf8tocp maz pl_utf8.txt > pl.txt
15+ ..\svarlang.lib\tlumacz en pl
16+ move out.lng ..\localcfg.lng
17+ move deflang.c ..\
18+ cd ..
19+
20+clean: .SYMBOLIC
21+ del *.obj
22+ del *.com
23+ del deflang.c
24+ del localcfg.lng
25+
26+buildpkg: localcfg.com .SYMBOLIC
27+ mkdir appinfo
28+ mkdir source
29+ mkdir source\localcfg
30+ mkdir source\localcfg\nls_lang
31+ mkdir source\localcfg\svarlang.lib
32+ mkdir bin
33+ mkdir doc
34+ mkdir doc\localcfg
35+ mkdir nls
36+ copy localcfg.lsm appinfo
37+ copy localcfg.com bin
38+ copy localcfg.lng nls
39+ copy svarlang.lib\*.* source\localcfg\svarlang.lib
40+ del source\localcfg\svarlang.lib\*.lib
41+ del source\localcfg\svarlang.lib\*.exe
42+ copy *.txt doc\localcfg
43+ copy *.c source\localcfg
44+ copy *.h source\localcfg
45+ copy *.txt source\localcfg
46+ copy makefile source\localcfg
47+ copy nls_lang\*.* source\localcfg\nls_lang
48+ if exist localcfg.zip del localcfg.zip
49+ zip -9rkDX -m localcfg.zip appinfo bin doc nls source
50+ rmdir appinfo
51+ rmdir source\localcfg\svarlang.lib
52+ rmdir source\localcfg\nls_lang
53+ rmdir source\localcfg
54+ rmdir source
55+ rmdir bin
56+ rmdir doc\localcfg
57+ rmdir doc
58+ rmdir nls
--- localcfg/tags/20220203/country.c (nonexistent)
+++ localcfg/tags/20220203/country.c (revision 612)
@@ -0,0 +1,335 @@
1+/*
2+ * functions that reads/writes from/to the localcfg country.sys-like file.
3+ * Copyright (C) Mateusz Viste 2015-2022
4+ */
5+
6+#include <stdio.h>
7+#include <string.h>
8+
9+#include "country.h"
10+
11+
12+struct funchdr {
13+ unsigned char funcname[8];
14+ unsigned short funcsiz;
15+};
16+
17+static unsigned char filebuff[1024];
18+
19+
20+/* fills a country struct with default values */
21+static void country_default(struct country *countrydata) {
22+
23+ /* first clear the memory */
24+ bzero(countrydata, sizeof(struct country));
25+
26+ /* fill in CTYINFO fields (non-zero values only) */
27+ countrydata->CTYINFO.id = 1;
28+ countrydata->CTYINFO.codepage = 437;
29+ /* countrydata->CTYINFO.datefmt = COUNTRY_DATE_MDY;
30+ countrydata->CTYINFO.timefmt = COUNTRY_TIME12; */
31+ countrydata->CTYINFO.currsym[0] = '$';
32+ countrydata->CTYINFO.decimal[0] = '.';
33+ countrydata->CTYINFO.thousands[0] = ',';
34+ countrydata->CTYINFO.datesep[0] = '/';
35+ countrydata->CTYINFO.timesep[0] = ':';
36+ countrydata->CTYINFO.currprec = 2;
37+ /* countrydata->CTYINFO.currencydecsym = 0; */
38+ /* countrydata->CTYINFO.currencyspace = 0; */
39+ /* countrydata->CTYINFO.currencypos = 0; */
40+
41+ /* fill in YESNO fields (non-zero values only) */
42+ countrydata->YESNO.yes[0] = 'Y';
43+ countrydata->YESNO.no[0] = 'N';
44+}
45+
46+
47+/* Loads data from a country.sys file into a country struct.
48+ * Returns 0 on success, non-zero otherwise. */
49+int country_read(struct country *countrydata, const char *fname) {
50+ short firstentryoffs;
51+ unsigned char *subfunctions[16] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
52+ NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
53+ short filesize;
54+ short subfunctionscount;
55+ unsigned char *functiondata;
56+ int x;
57+ FILE *fd;
58+
59+ /* preload the country struct with default values */
60+ country_default(countrydata);
61+
62+ /* load the file into buff, if file exists */
63+ fd = fopen(fname, "rb");
64+ if (fd == NULL) return(0); /* "file doesn't exist" is not an error condition */
65+ filesize = fread(filebuff, 1, sizeof(filebuff), fd);
66+ fclose(fd);
67+
68+ /* check that it's a country file - should start with 0xFF COUNTRY 0x00 */
69+ if (memcmp(filebuff, "\377COUNTRY\0", 9) != 0) return(COUNTRY_ERR_INV_FORMAT);
70+
71+ /* check that it's one of my country.sys files - should contain a trailer */
72+ if (memcmp(filebuff + filesize - 8, "LOCALCFG", 8) != 0) return(COUNTRY_ERR_NOT_LOCALCFG);
73+
74+ /* read the offset of the entries index - must be at least 23 */
75+ functiondata = filebuff + 19;
76+ firstentryoffs = *((unsigned short *)functiondata);
77+ if ((firstentryoffs < 23) || (firstentryoffs >= filesize)) return(-4);
78+ functiondata = filebuff + firstentryoffs;
79+
80+ /* how many entries do we have? I expect exactly one. */
81+ if (*((unsigned short *)functiondata) != 1) return(-5);
82+ /* skip to the first country entry */
83+ functiondata += 2;
84+
85+ /* skip directly to the subfunctions of the first country */
86+ /* ddwords: size, country, codepage, reserved, reserved, offset */
87+ /* printf("Size = %d\n", READSHORT(functiondata)); */
88+ functiondata += 2; /* skip size */
89+ /* printf("Country = %d\n", READSHORT(functiondata[0]); */
90+ functiondata += 2; /* skip country */
91+ /* printf("Codepage = %d\n", READSHORT(functiondata)); */
92+ functiondata += 2; /* skip codepage */
93+ functiondata += 4; /* skip reserved fields */
94+ firstentryoffs = *((unsigned short *)functiondata); /* read offset of the subfunctions index */
95+ functiondata = filebuff + firstentryoffs;
96+
97+ /* read all subfunctions, but no more than 15 */
98+ subfunctionscount = *((unsigned short *)functiondata);
99+ /* printf("Found %d subfunctions\n", subfunctionscount); */
100+ functiondata += 2;
101+ for (x = 0; (x < 15) && (x < subfunctionscount); x++) {
102+ short size = *((unsigned short *)functiondata);
103+ functiondata += 2;
104+ functiondata += 2; /* skip ID of the subfunction */
105+ subfunctions[x] = filebuff + *((unsigned short *)functiondata);
106+ /* printf("subfunction %d at 0x%p\n", x, subfunctions[x]); */
107+ functiondata += size - 2;
108+ }
109+
110+ /* load every subfunction, and feed the country struct with data */
111+ for (x = 0; subfunctions[x] != NULL; x++) {
112+ struct funchdr *hdr = (void *)(subfunctions[x]);
113+ functiondata = subfunctions[x] + 10;
114+ /* */
115+ if ((memcmp(hdr->funcname, "\377YESNO ", 8) == 0) && (hdr->funcsiz == 4)) {
116+ memcpy(&(countrydata->YESNO), functiondata, hdr->funcsiz);
117+ } else if ((memcmp(hdr->funcname, "\377CTYINFO", 8) == 0) && (hdr->funcsiz == 22)) {
118+ memcpy(&(countrydata->CTYINFO), functiondata, hdr->funcsiz);
119+ }
120+ }
121+
122+ return(0);
123+}
124+
125+
126+#define MSB(x) (((x) >> 8) & 0xff)
127+#define LSB(x) ((x) & 0xff)
128+
129+
130+/* Computes a new country.sys file based on data from a country struct.
131+ * Returns 0 on success, non-zero otherwise. */
132+int country_write(const char *fname, struct country *c) {
133+ short filesize = 0;
134+ FILE *fd;
135+ int x;
136+ short subfunction_id[7] = {1,2,4,5,6,7,35};
137+ short subfunction_ptr[7];
138+
139+ const unsigned char ucase_437[128] = {128, 154, 69, 65, 142, 65, 143, 128,
140+ 69, 69, 69, 73, 73, 73, 142, 143,
141+ 144, 146, 146, 79, 153, 79, 85, 85,
142+ 89, 153, 154, 155, 156, 157, 158, 159,
143+ 65, 73, 79, 85, 165, 165, 166, 167,
144+ 168, 169, 170, 171, 172, 173, 174, 175,
145+ 176, 177, 178, 179, 180, 181, 182, 183,
146+ 184, 185, 186, 187, 188, 189, 190, 191,
147+ 192, 193, 194, 195, 196, 197, 198, 199,
148+ 200, 201, 202, 203, 204, 205, 206, 207,
149+ 208, 209, 210, 211, 212, 213, 214, 215,
150+ 216, 217, 218, 219, 220, 221, 222, 223,
151+ 224, 225, 226, 227, 228, 229, 230, 231,
152+ 232, 233, 234, 235, 236, 237, 238, 239,
153+ 240, 241, 242, 243, 244, 245, 246, 247,
154+ 248, 249, 250, 251, 252, 253, 254, 255};
155+
156+ const unsigned char collate_437[256] = { 0, 1, 2, 3, 4, 5, 6, 7,
157+ 8, 9, 10, 11, 12, 13, 14, 15,
158+ 16, 17, 18, 19, 20, 21, 22, 23,
159+ 24, 25, 26, 27, 28, 29, 30, 31,
160+ 32, 33, 34, 35, 36, 37, 38, 39,
161+ 40, 41, 42, 43, 44, 45, 46, 47,
162+ 48, 49, 50, 51, 52, 53, 54, 55,
163+ 56, 57, 58, 59, 60, 61, 62, 63,
164+ 64, 65, 66, 67, 68, 69, 70, 71,
165+ 72, 73, 74, 75, 76, 77, 78, 79,
166+ 80, 81, 82, 83, 84, 85, 86, 87,
167+ 88, 89, 90, 91, 92, 93, 94, 95,
168+ 96, 65, 66, 67, 68, 69, 70, 71,
169+ 72, 73, 74, 75, 76, 77, 78, 79,
170+ 80, 81, 82, 83, 84, 85, 86, 87,
171+ 88, 89, 90, 123, 124, 125, 126, 127,
172+ 67, 85, 69, 65, 65, 65, 65, 67,
173+ 69, 69, 69, 73, 73, 73, 65, 65,
174+ 69, 65, 65, 79, 79, 79, 85, 85,
175+ 89, 79, 85, 36, 36, 36, 36, 36,
176+ 65, 73, 79, 85, 78, 78, 166, 167,
177+ 63, 169, 170, 171, 172, 33, 34, 34,
178+ 176, 177, 178, 179, 180, 181, 182, 183,
179+ 184, 185, 186, 187, 188, 189, 190, 191,
180+ 192, 193, 194, 195, 196, 197, 198, 199,
181+ 200, 201, 202, 203, 204, 205, 206, 207,
182+ 208, 209, 210, 211, 212, 213, 214, 215,
183+ 216, 217, 218, 219, 220, 221, 222, 223,
184+ 224, 83, 226, 227, 228, 229, 230, 231,
185+ 232, 233, 234, 235, 236, 237, 238, 239,
186+ 240, 241, 242, 243, 244, 245, 246, 247,
187+ 248, 249, 250, 251, 252, 253, 254, 255};
188+
189+ /* zero out filebuff */
190+ bzero(filebuff, sizeof(filebuff));
191+
192+ /* compute the country.sys structures */
193+ memcpy(filebuff, "\377COUNTRY\0\0\0\0\0\0\0\0\1\0\1", 19); /* header */
194+ filesize = 19;
195+ /* first entry offset (always current offset+4) */
196+ filesize += 4;
197+ memcpy(filebuff + filesize - 4, &filesize, sizeof(filesize));
198+ /* number of entries */
199+ filebuff[filesize] = 1;
200+ filesize += 2;
201+ /* first (and only) entry / size, country, codepage, reserved(2), offset */
202+ filebuff[filesize++] = 12; /* size LSB */
203+ filebuff[filesize++] = 0; /* size MSB */
204+ filebuff[filesize++] = LSB(c->CTYINFO.id); /* country LSB */
205+ filebuff[filesize++] = MSB(c->CTYINFO.id); /* country MSB */
206+ filebuff[filesize++] = LSB(c->CTYINFO.codepage); /* codepage LSB */
207+ filebuff[filesize++] = MSB(c->CTYINFO.codepage); /* codepage MSB */
208+ filesize += 4; /* reserved bytes */
209+
210+ filesize += 4;
211+ memcpy(filebuff + filesize - 4, &filesize, sizeof(filesize));
212+
213+ /* index of subfunctions */
214+ filebuff[filesize] = 7; /* there are 7 subfunctions */
215+ filesize += 2;
216+ for (x = 0; x < 7; x++) { /* dump each subfunction (size, id, offset) */
217+ /* size is always 6 */
218+ filebuff[filesize] = 6;
219+ filesize += 2;
220+ /* id of the subfunction */
221+ filebuff[filesize++] = LSB(subfunction_id[x]);
222+ filebuff[filesize++] = MSB(subfunction_id[x]);
223+ /* remember the offset of the subfunction pointer for later */
224+ subfunction_ptr[x] = filesize;
225+ filesize += 4;
226+ }
227+
228+ /* write the CTYINFO subfunction */
229+ memcpy(filebuff + subfunction_ptr[0], &filesize, sizeof(filesize));
230+
231+ /* subfunction header */
232+ memcpy(filebuff + filesize, "\377CTYINFO", 8);
233+ filesize += 8;
234+ /* subfunction size */
235+ filebuff[filesize] = 22;
236+ filesize += 2;
237+
238+ /* country preferences */
239+ memcpy(filebuff + filesize, &(c->CTYINFO), 22);
240+ filesize += 22;
241+
242+ /* write the UCASE subfunction (used for LCASE, too) */
243+ memcpy(filebuff + subfunction_ptr[1], &filesize, sizeof(filesize));
244+ memcpy(filebuff + subfunction_ptr[2], &filesize, sizeof(filesize));
245+
246+ /* subfunction header */
247+ memcpy(filebuff + filesize, "\377UCASE ", 8);
248+ filesize += 8;
249+ /* subfunction size */
250+ filebuff[filesize++] = 128;
251+ filebuff[filesize++] = 0;
252+ /* UCASE table */
253+ memcpy(filebuff + filesize, ucase_437, 128);
254+ filesize += 128;
255+
256+ /* write the FCHAR subfunction (filename terminator table) */
257+ memcpy(filebuff + subfunction_ptr[3], &filesize, sizeof(filesize));
258+
259+ /* subfunction header */
260+ memcpy(filebuff + filesize, "\377FCHAR ", 8);
261+ filesize += 8;
262+ /* subfunction size */
263+ filebuff[filesize++] = 22;
264+ filebuff[filesize++] = 0;
265+ /* values here are quite obscure, dumped from country.sys */
266+ filebuff[filesize++] = 142;
267+ filebuff[filesize++] = 0;
268+ filebuff[filesize++] = 255;
269+ filebuff[filesize++] = 65;
270+ filebuff[filesize++] = 0;
271+ filebuff[filesize++] = 32;
272+ filebuff[filesize++] = 238;
273+ /* list of characters that terminates a filename */
274+ filebuff[filesize++] = 14; /* how many of them */
275+ filebuff[filesize++] = 46; /* . */
276+ filebuff[filesize++] = 34; /* " */
277+ filebuff[filesize++] = 47; /* / */
278+ filebuff[filesize++] = 92; /* \ */
279+ filebuff[filesize++] = 91; /* [ */
280+ filebuff[filesize++] = 93; /* ] */
281+ filebuff[filesize++] = 58; /* : */
282+ filebuff[filesize++] = 124; /* | */
283+ filebuff[filesize++] = 60; /* < */
284+ filebuff[filesize++] = 62; /* > */
285+ filebuff[filesize++] = 43; /* + */
286+ filebuff[filesize++] = 61; /* = */
287+ filebuff[filesize++] = 59; /* ; */
288+ filebuff[filesize++] = 44; /* , */
289+
290+ /* write the COLLATE subfunction */
291+ memcpy(filebuff + subfunction_ptr[4], &filesize, sizeof(filesize));
292+
293+ /* subfunction header */
294+ memcpy(filebuff + filesize, "\377COLLATE", 8);
295+ filesize += 8;
296+ /* subfunction size */
297+ filebuff[filesize++] = LSB(256);
298+ filebuff[filesize++] = MSB(256);
299+ /* collation for standard CP437 */
300+ memcpy(filebuff + filesize, collate_437, 256);
301+ filesize += 256;
302+
303+ /* write the DBCS subfunction */
304+ memcpy(filebuff + subfunction_ptr[5], &filesize, sizeof(filesize));
305+ /* subfunction header */
306+ memcpy(filebuff + filesize, "\377DBCS ", 8);
307+ filesize += 8;
308+ /* subfunction size */
309+ filebuff[filesize++] = 0;
310+ filebuff[filesize++] = 0;
311+ /* table terminator (must be there even if no lenght is zero */
312+ filebuff[filesize++] = 0;
313+ filebuff[filesize++] = 0;
314+
315+ /* write the YESNO subfunction */
316+ memcpy(filebuff + subfunction_ptr[6], &filesize, sizeof(filesize));
317+ memcpy(filebuff + filesize, "\377YESNO ", 8);
318+ filesize += 8;
319+ filebuff[filesize] = 4; /* size (LSB) */
320+ filesize += 2;
321+ memcpy(filebuff + filesize, &(c->YESNO), 4);
322+ filesize += 4;
323+
324+ /* write the file trailer */
325+ memcpy(filebuff + filesize, "LOCALCFG", 8);
326+ filesize += 8;
327+
328+ /* write the buffer to file */
329+ fd = fopen(fname, "wb");
330+ if (fd == NULL) return(-1);
331+ fwrite(filebuff, 1, filesize, fd);
332+ fclose(fd);
333+
334+ return(0);
335+}
--- localcfg/tags/20220203/country.h (nonexistent)
+++ localcfg/tags/20220203/country.h (revision 612)
@@ -0,0 +1,57 @@
1+/*
2+ * functions that read/write from/to the localcfg country.sys-like file.
3+ * Copyright (C) Mateusz Viste 2015-2022
4+ */
5+
6+#ifndef country_h_sentinel
7+#define country_h_sentinel
8+
9+enum COUNTRY_DATEFMT {
10+ COUNTRY_DATE_MDY = 0, /* Month, Day, Year */
11+ COUNTRY_DATE_DMY = 1, /* Day, Month, Year */
12+ COUNTRY_DATE_YMD = 2 /* Year, Month, Day */
13+};
14+
15+enum COUNTRY_TIMEFMT {
16+ COUNTRY_TIME12 = 0, /* AM/PM format (like 6:32 PM) */
17+ COUNTRY_TIME24 = 1 /* 24h format (like 18:32) */
18+};
19+
20+#define COUNTRY_ERR_INV_FORMAT -86
21+#define COUNTRY_ERR_NOT_LOCALCFG -87
22+
23+struct country {
24+
25+ struct {
26+ unsigned short id; /* international id (48=PL, 33=FR, 01=US...) */
27+ unsigned short codepage; /* usual codepage */
28+ unsigned short datefmt; /* date format */
29+ char currsym[5]; /* currency symbol */
30+ char thousands[2]; /* thousands separator */
31+ char decimal[2]; /* decimal separator (like . or ,) */
32+ char datesep[2]; /* date separator (usually '-', '.' or '/') */
33+ char timesep[2]; /* time separator (usually ':') */
34+ unsigned char currpos:1; /* 0=currency precedes the value, 1=follows it */
35+ unsigned char currspace:1; /* set if the currency symbol should be one space away from the value */
36+ unsigned char currdecsym:1; /* set if the currency symbol should replace the decimal point */
37+ unsigned char ZEROED:5;
38+ unsigned char currprec; /* currency precision (2 = 0.12) */
39+ unsigned char timefmt; /* time format */
40+ } CTYINFO;
41+
42+ struct {
43+ char yes[2];
44+ char no[2];
45+ } YESNO;
46+
47+};
48+
49+/* Loads data from a country.sys file into a country struct.
50+ * Returns 0 on success, non-zero otherwise. */
51+int country_read(struct country *countrydata, const char *fname);
52+
53+/* Computes a new country.sys file based on data from a country struct.
54+ * Returns 0 on success, non-zero otherwise. */
55+int country_write(const char *fname, struct country *countrydata);
56+
57+#endif
--- localcfg/tags/20220203/history.txt (nonexistent)
+++ localcfg/tags/20220203/history.txt (revision 612)
@@ -0,0 +1,16 @@
1+localcfg history file
2+
3+* localcfg ver 20220203
4+ - NLS (translations) support through the SvarLANG library
5+ - memory usage optimizations
6+ - extra error messages
7+
8+* localcfg ver 20220202 (merged into the SvarDOS project)
9+ - country.sys path is optional, defaults to %DOSDIR%\CFG\COUNTRY.SYS
10+ - COUNTRY=xxx example contains the actual codepage and path to COUNTRY.SYS
11+ - improved loading/saving routines so they rely on memory structures
12+ - relicensed from BSD 2-clause to MIT
13+ - moved from Turbo C to OpenWatcom
14+
15+* localcfg v0.90 [02 June 2015]
16+ - first public release
--- localcfg/tags/20220203/localcfg.c (nonexistent)
+++ localcfg/tags/20220203/localcfg.c (revision 612)
@@ -0,0 +1,474 @@
1+/*
2+ * Locales configuration for SvarDOS
3+ *
4+ * Copyright (C) Mateusz Viste 2015-2022
5+ *
6+ * MIT license
7+ *
8+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9+ * of this software and associated documentation files (the "Software"), to
10+ * deal in the Software without restriction, including without limitation the
11+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12+ * sell copies of the Software, and to permit persons to whom the Software is
13+ * furnished to do so, subject to the following conditions:
14+ *
15+ * The above copyright notice and this permission notice shall be included in
16+ * all copies or substantial portions of the Software.
17+ *
18+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24+ * IN THE SOFTWARE.
25+ */
26+
27+#include <stdio.h>
28+#include <stdlib.h> /* atoi() */
29+#include <string.h> /* strchr */
30+
31+#include "svarlang.lib/svarlang.h"
32+
33+#include "country.h"
34+
35+#define PVER "20220203"
36+#define PDATE "2015-2022"
37+
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+ NLS_ERR_INVFORMAT = 0x0904,
77+ NLS_ERR_NOTLOCALCFG = 0x0905
78+};
79+
80+
81+static void output(const char *s) {
82+ _asm {
83+ /* set cx to strlen(s) */
84+ push ds
85+ pop es
86+ mov di, s
87+ xor al, al
88+ cld
89+ mov cx, 0xff
90+ repne scasb /* compare ES:DI with AL, inc DI until match */
91+ mov cx, di
92+ sub cx, s
93+ dec cx
94+ /* output via DOS */
95+ mov ah, 0x40 /* write to handle */
96+ mov bx, 1 /* 1=stdout */
97+ mov dx, s
98+ int 0x21
99+ }
100+}
101+
102+
103+static void crlf(void) {
104+ output("\r\n");
105+}
106+
107+
108+static void outputnl(const char *s) {
109+ output(s);
110+ crlf();
111+}
112+
113+
114+static void nls_put(enum NLS_STRINGS id) {
115+ output(svarlang_strid(id));
116+}
117+
118+
119+static void nls_puts(enum NLS_STRINGS id) {
120+ nls_put(id);
121+ crlf();
122+}
123+
124+
125+static void about(void) {
126+ output("localcfg ");
127+ nls_put(NLS_HLP_VER);
128+ outputnl(" " PVER ", (C) " PDATE " Mateusz Viste");
129+ nls_puts(NLS_HLP_DESC);
130+ crlf();
131+ nls_puts(NLS_HLP_USAGE);
132+ crlf();
133+ nls_puts(NLS_HLP_OPTIONS);
134+ crlf();
135+ nls_puts(NLS_HLP_COUNTRY);
136+ nls_puts(NLS_HLP_CP);
137+ nls_puts(NLS_HLP_DECIM);
138+ nls_puts(NLS_HLP_THOUS);
139+ nls_puts(NLS_HLP_DATESEP);
140+ nls_puts(NLS_HLP_DATEFMT);
141+ nls_puts(NLS_HLP_TIMESEP);
142+ nls_puts(NLS_HLP_TIMEFMT);
143+ nls_puts(NLS_HLP_CURR);
144+ nls_puts(NLS_HLP_CURRPOS0);
145+ nls_puts(NLS_HLP_CURRPOS1);
146+ nls_puts(NLS_HLP_CURRPOS2);
147+ nls_puts(NLS_HLP_CURRSPC);
148+ nls_puts(NLS_HLP_CURRPREC);
149+ nls_puts(NLS_HLP_YESNO);
150+ crlf();
151+ nls_puts(NLS_HLP_INFOLOC1);
152+ nls_puts(NLS_HLP_INFOLOC2);
153+}
154+
155+
156+static char *datestring(char *result, struct country *c) {
157+ switch (c->CTYINFO.datefmt) {
158+ case COUNTRY_DATE_MDY:
159+ sprintf(result, "12%c31%c1990", c->CTYINFO.datesep[0], c->CTYINFO.datesep[0]);
160+ break;
161+ case COUNTRY_DATE_DMY:
162+ sprintf(result, "31%c12%c1990", c->CTYINFO.datesep[0], c->CTYINFO.datesep[0]);
163+ break;
164+ case COUNTRY_DATE_YMD:
165+ default:
166+ sprintf(result, "1990%c12%c31", c->CTYINFO.datesep[0], c->CTYINFO.datesep[0]);
167+ break;
168+ }
169+ return(result);
170+}
171+
172+
173+static char *timestring(char *result, struct country *c) {
174+ if (c->CTYINFO.timefmt == COUNTRY_TIME12) {
175+ sprintf(result, "11%c59%c59 PM", c->CTYINFO.timesep[0], c->CTYINFO.timesep[0]);
176+ } else {
177+ sprintf(result, "23%c59%c59", c->CTYINFO.timesep[0], c->CTYINFO.timesep[0]);
178+ }
179+ return(result);
180+}
181+
182+
183+static char *currencystring(char *result, struct country *c) {
184+ char decimalpart[16];
185+ char space[2] = {0, 0};
186+ char decsym[8];
187+ char cursym[8];
188+ decimalpart[0] = '1';
189+ decimalpart[1] = '2';
190+ decimalpart[2] = '3';
191+ decimalpart[3] = '4';
192+ decimalpart[4] = '5';
193+ decimalpart[5] = '6';
194+ decimalpart[6] = '7';
195+ decimalpart[7] = '8';
196+ decimalpart[8] = '9';
197+ decimalpart[9] = 0;
198+ /* prepare the decimal string first */
199+ if (c->CTYINFO.currprec < 9) {
200+ decimalpart[c->CTYINFO.currprec] = 0;
201+ }
202+ /* prepare the currency space string */
203+ if (c->CTYINFO.currspace != 0) {
204+ space[0] = ' ';
205+ }
206+ /* prepare the currency and decimal symbols */
207+ if (c->CTYINFO.currdecsym != 0) { /* currency replaces the decimal point */
208+ sprintf(decsym, "%s", c->CTYINFO.currsym);
209+ cursym[0] = 0;
210+ } else {
211+ sprintf(decsym, "%c", c->CTYINFO.decimal[0]);
212+ sprintf(cursym, "%s", c->CTYINFO.currsym);
213+ }
214+ if (c->CTYINFO.currprec == 0) decsym[0] = 0;
215+ /* compute the final string */
216+ if (c->CTYINFO.currpos == 0) { /* currency precedes value */
217+ sprintf(result, "%s%s99%s%s", cursym, space, decsym, decimalpart);
218+ } else { /* currency follows value or replaces decimal symbol */
219+ sprintf(result, "99%s%s%s%s", decsym, decimalpart, space, cursym);
220+ }
221+ return(result);
222+}
223+
224+
225+/* checks if str starts with prefix. returns 0 if so, non-zero otherwise. */
226+static int stringstartswith(char *str, char *prefix) {
227+ for (;;) {
228+ /* end of prefix means success */
229+ if (*prefix == 0) return(0);
230+ /* otherwise there is no match */
231+ if (*str != *prefix) return(-1);
232+ /* if match good so far, look at next char */
233+ str += 1;
234+ prefix += 1;
235+ }
236+}
237+
238+
239+/* processes an argument. returns 0 on success, non-zero otherwise. */
240+static int processarg(char *arg, struct country *c) {
241+ char *value;
242+ int intvalue;
243+ /* an option must start with a '/' */
244+ if (arg[0] != '/') return(-1);
245+ arg += 1; /* skip the slash */
246+ /* find where the value starts */
247+ value = strchr(arg, ':');
248+ /* if no value present, fail */
249+ if (value == NULL) return(-2);
250+ value += 1;
251+ if (*value == 0) return(-3);
252+ /* interpret the option now */
253+ if (stringstartswith(arg, "country:") == 0) {
254+ intvalue = atoi(value);
255+ if ((intvalue > 0) && (intvalue < 1000)) {
256+ c->CTYINFO.id = intvalue;
257+ return(0);
258+ }
259+ } else if (stringstartswith(arg, "cp:") == 0) {
260+ intvalue = atoi(value);
261+ if ((intvalue > 0) && (intvalue < 1000)) {
262+ c->CTYINFO.codepage = intvalue;
263+ return(0);
264+ }
265+ } else if (stringstartswith(arg, "decim:") == 0) {
266+ if (value[1] == 0) { /* value must be exactly one character */
267+ c->CTYINFO.decimal[0] = *value;
268+ return(0);
269+ }
270+ } else if (stringstartswith(arg, "thous:") == 0) {
271+ if (value[1] == 0) { /* value must be exactly one character */
272+ c->CTYINFO.thousands[0] = *value;
273+ return(0);
274+ }
275+ } else if (stringstartswith(arg, "datesep:") == 0) {
276+ if (value[1] == 0) { /* value must be exactly one character */
277+ c->CTYINFO.datesep[0] = *value;
278+ return(0);
279+ }
280+ } else if (stringstartswith(arg, "timesep:") == 0) {
281+ if (value[1] == 0) { /* value must be exactly one character */
282+ c->CTYINFO.timesep[0] = *value;
283+ return(0);
284+ }
285+ } else if (stringstartswith(arg, "datefmt:") == 0) {
286+ if (strcmp(value, "MDY") == 0) {
287+ c->CTYINFO.datefmt = COUNTRY_DATE_MDY;
288+ return(0);
289+ } else if (strcmp(value, "DMY") == 0) {
290+ c->CTYINFO.datefmt = COUNTRY_DATE_DMY;
291+ return(0);
292+ } else if (strcmp(value, "YMD") == 0) {
293+ c->CTYINFO.datefmt = COUNTRY_DATE_YMD;
294+ return(0);
295+ }
296+ } else if (stringstartswith(arg, "timefmt:") == 0) {
297+ if (value[1] == 0) {
298+ if ((value[0] >= '0') && (value[0] <= '1')) {
299+ c->CTYINFO.timefmt = value[0] - '0';
300+ return(0);
301+ }
302+ }
303+ } else if (stringstartswith(arg, "curr:") == 0) {
304+ if (strlen(value) <= 4) {
305+ strcpy(c->CTYINFO.currsym, value);
306+ return(0);
307+ }
308+ } else if (stringstartswith(arg, "currpos:") == 0) {
309+ if (value[1] == 0) {
310+ if (value[0] == '0') {
311+ c->CTYINFO.currpos = 0;
312+ return(0);
313+ } else if (value[0] == '1') {
314+ c->CTYINFO.currpos = 1;
315+ return(0);
316+ } else if (value[0] == '2') {
317+ c->CTYINFO.currpos = 0;
318+ c->CTYINFO.currdecsym = 1;
319+ return(0);
320+ }
321+ }
322+ } else if (stringstartswith(arg, "currspc:") == 0) {
323+ if (value[1] == 0) {
324+ if ((value[0] >= '0') && (value[0] <= '1')) {
325+ c->CTYINFO.currspace = value[0] - '0';
326+ return(0);
327+ }
328+ }
329+ } else if (stringstartswith(arg, "currprec:") == 0) {
330+ if (value[1] == 0) {
331+ if ((value[0] >= '0') && (value[0] <= '9')) {
332+ c->CTYINFO.currprec = value[0] - '0';
333+ return(0);
334+ }
335+ }
336+ } else if (stringstartswith(arg, "yesno:") == 0) {
337+ /* string must be exactly 2 characters long */
338+ if ((value[0] != 0) && (value[1] != 0) && (value[2] == 0)) {
339+ c->YESNO.yes[0] = value[0];
340+ c->YESNO.no[0] = value[1];
341+ return(0);
342+ }
343+ }
344+ /* if I'm here, something went wrong */
345+ return(-4);
346+}
347+
348+
349+/* converts a path to its canonic representation, returns 0 on success
350+ * or DOS err on failure (invalid drive) */
351+static unsigned short file_truename(const char *dst, char *src) {
352+ unsigned short res = 0;
353+ _asm {
354+ push es
355+ mov ah, 0x60 /* query truename, DS:SI=src, ES:DI=dst */
356+ push ds
357+ pop es
358+ mov si, src
359+ mov di, dst
360+ int 0x21
361+ jnc DONE
362+ mov [res], ax
363+ DONE:
364+ pop es
365+ }
366+ return(res);
367+}
368+
369+
370+static void default_country_path(char *s) {
371+ char *dosdir = getenv("DOSDIR");
372+ size_t dosdirlen;
373+ s[0] = 0;
374+ if (dosdir == NULL) return;
375+ dosdirlen = strlen(dosdir);
376+ if (dosdirlen == 0) return;
377+ /* drop trailing backslash if present */
378+ if (dosdir[dosdirlen - 1] == '\\') dosdirlen--;
379+ /* copy dosdir to s and append the rest of the path */
380+ memcpy(s, dosdir, dosdirlen);
381+ strcpy(s + dosdirlen, "\\CFG\\COUNTRY.SYS");
382+}
383+
384+
385+int main(int argc, char **argv) {
386+ struct country cntdata;
387+ int changedflag;
388+ int x;
389+ static char fname[130];
390+ static char buff[64];
391+
392+ svarlang_autoload("localcfg");
393+
394+ /* scan argv looking for the path to country.sys */
395+ for (x = 1; x < argc; x++) {
396+ if (argv[x][0] != '/') {
397+ if (fname[0] != 0) {
398+ nls_puts(NLS_ERR_FILEPATHTWICE);
399+ return(1);
400+ }
401+ /* */
402+ if (file_truename(fname, argv[x]) != 0) {
403+ nls_puts(NLS_ERR_BADPATH);
404+ return(1);
405+ }
406+ } else if (strcmp(argv[x], "/?") == 0) { /* is it /? */
407+ about();
408+ return(1);
409+ }
410+ }
411+
412+ /* if no file path provided, look into %DOSDIR%\CFG\COUNTRY.SYS */
413+ if (fname[0] == 0) default_country_path(fname);
414+
415+ x = country_read(&cntdata, fname);
416+ if (x != 0) {
417+ if (x == COUNTRY_ERR_INV_FORMAT) {
418+ nls_puts(NLS_ERR_INVFORMAT);
419+ } else if (x == COUNTRY_ERR_NOT_LOCALCFG) {
420+ nls_puts(NLS_ERR_NOTLOCALCFG);
421+ } else {
422+ nls_puts(NLS_ERR_READFAIL);
423+ }
424+ return(2);
425+ }
426+
427+ changedflag = 0;
428+
429+ /* process command line arguments */
430+ for (x = 1; x < argc; x++) {
431+ if (argv[x][0] != '/') continue; /* skip country.sys filename (processed earlier) */
432+ changedflag++;
433+ if (processarg(argv[x], &cntdata) != 0) {
434+ nls_puts(NLS_ERR_INVPARAM);
435+ return(3);
436+ }
437+ }
438+
439+ nls_put(NLS_INFO_COUNTRY);
440+ sprintf(buff, " %03d", cntdata.CTYINFO.id);
441+ outputnl(buff);
442+ nls_put(NLS_INFO_CODEPAGE);
443+ sprintf(buff, " %d", cntdata.CTYINFO.codepage);
444+ outputnl(buff);
445+ nls_put(NLS_INFO_DECSEP);
446+ sprintf(buff, " %c", cntdata.CTYINFO.decimal[0]);
447+ outputnl(buff);
448+ nls_put(NLS_INFO_THOUSEP);
449+ sprintf(buff, " %c", cntdata.CTYINFO.thousands[0]);
450+ outputnl(buff);
451+ nls_put(NLS_INFO_DATEFMT);
452+ output(" ");
453+ outputnl(datestring(buff, &cntdata));
454+ nls_put(NLS_INFO_TIMEFMT);
455+ output(" ");
456+ outputnl(timestring(buff, &cntdata));
457+ nls_put(NLS_INFO_YESNO);
458+ sprintf(buff, " %c/%c", cntdata.YESNO.yes[0], cntdata.YESNO.no[0]);
459+ outputnl(buff);
460+ nls_put(NLS_INFO_CURREXAMPLE);
461+ output(" ");
462+ outputnl(currencystring(buff, &cntdata));
463+
464+ crlf();
465+ nls_puts(NLS_MAKESURE);
466+ sprintf(buff, "COUNTRY=%03d,%03d,", cntdata.CTYINFO.id, cntdata.CTYINFO.codepage);
467+ output(buff);
468+ outputnl(fname);
469+
470+ /* if anything changed, write the new file */
471+ if (changedflag != 0) country_write(fname, &cntdata);
472+
473+ return(0);
474+}
--- localcfg/tags/20220203/localcfg.txt (nonexistent)
+++ localcfg/tags/20220203/localcfg.txt (revision 612)
@@ -0,0 +1,36 @@
1+
2+localcfg - SvarDOS locales editor
3+
4+
5+*** About ***
6+
7+localcfg is a 16 bit DOS tool that provides an easy way of configurating system
8+locales by generating a custom COUNTRY.SYS file that reflects user's
9+preferences.
10+
11+Run localcfg /? for usage instructions.
12+
13+
14+*** License ***
15+
16+localcfg is written by Mateusz Viste, and published under the MIT license.
17+
18+Copyright (C) 2015-2022 Mateusz Viste
19+
20+Permission is hereby granted, free of charge, to any person obtaining a copy
21+of this software and associated documentation files (the "Software"), to deal
22+in the Software without restriction, including without limitation the rights
23+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
24+copies of the Software, and to permit persons to whom the Software is
25+furnished to do so, subject to the following conditions:
26+
27+The above copyright notice and this permission notice shall be included in all
28+copies or substantial portions of the Software.
29+
30+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
35+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36+SOFTWARE.
--- localcfg/trunk/Makefile (revision 611)
+++ localcfg/trunk/Makefile (revision 612)
@@ -45,6 +45,7 @@
4545 copy *.txt source\localcfg
4646 copy makefile source\localcfg
4747 copy nls_lang\*.* source\localcfg\nls_lang
48+ if exist localcfg.zip del localcfg.zip
4849 zip -9rkDX -m localcfg.zip appinfo bin doc nls source
4950 rmdir appinfo
5051 rmdir source\localcfg\svarlang.lib
Show on old repository browser