1 |
|
---|
2 |
|
---|
3 | 1988-10-28 20:08:06 -- Page 1: NEWVER.C
|
---|
4 |
|
---|
5 |
|
---|
6 | 1 /*
|
---|
7 | 2 =============================================================================
|
---|
8 | 3 newver.c -- read and update a GEMDOS version message object file
|
---|
9 | 4 Version 1 -- 1988-10-28 -- D.N. Lynx Crowe
|
---|
10 | 5 (c) Copyright 1988 -- D.N. Lynx Crowe -- All rights reserved
|
---|
11 | 6
|
---|
12 | 7 Compiled and linked with the GEMDOS Alcyon C developer's package.
|
---|
13 | 8
|
---|
14 | 9 NOTE: Because we use the Alcyon GEMDOS object file format,
|
---|
15 | 10 which is specific to the Atari, this code is NON-PORTABLE.
|
---|
16 | 11
|
---|
17 | 12 The idea, however, is adaptable to a wide variety of systems
|
---|
18 | 13 and object file formats.
|
---|
19 | 14
|
---|
20 | 15 Note also that the fopen() function in the Alcyon C library does not
|
---|
21 | 16 support the "r+" option, making it necessary to close the file and
|
---|
22 | 17 then open it again before writing. This is a serious shortcoming of
|
---|
23 | 18 the Alcyon C library, as it makes updating files only possible by a
|
---|
24 | 19 series of questionable maneuvers, (e.g. opening, closing, and reopening
|
---|
25 | 20 the file, or using open(), then fdopen(), etc.).
|
---|
26 | 21 =============================================================================
|
---|
27 | 22 */
|
---|
28 | 23
|
---|
29 | 24 #include "stdio.h" /* Atari GEMDOS standard I/O definitions */
|
---|
30 | 25 #include "stddefs.h" /* some usefull standard C definitions */
|
---|
31 | 26 #include "objdefs.h" /* GEMDOS object file definitions */
|
---|
32 | 27
|
---|
33 | 28 #define VERFILE "verdate.o" /* version message file */
|
---|
34 | 29
|
---|
35 | 30 extern int errno; /* system error code */
|
---|
36 | 31
|
---|
37 | 32 extern char *now(); /* get formatted system date and time */
|
---|
38 | 33
|
---|
39 | 34 FILE *fp; /* VERFILE file pointer */
|
---|
40 | 35
|
---|
41 | 36 /* 000000000011111111112 */
|
---|
42 | 37 /* 012345678901234567890 */
|
---|
43 | 38 char dtg[22]; /* yyyy-mm-dd hh:mm:ss zero terminated string */
|
---|
44 | 39
|
---|
45 | 40 /* 000000000011 */
|
---|
46 | 41 /* 012345678901 */
|
---|
47 | 42 char verstr[12]; /* yyyymmdd.vv zero terminated string */
|
---|
48 | 43
|
---|
49 | 44 struct vb { /* VERFILE buffer (66 bytes) */
|
---|
50 | 45
|
---|
51 | 46 struct EXFILE hdr;
|
---|
52 | 47 char ver[12];
|
---|
53 | 48 struct SYMBOL sym;
|
---|
54 | 49 char rem[12];
|
---|
55 | 50
|
---|
56 | 51 } verbuf;
|
---|
57 | 52
|
---|
58 | 53 /* |
---|
59 |
|
---|
60 |
|
---|
61 | 1988-10-28 20:08:06 -- Page 2: NEWVER.C
|
---|
62 |
|
---|
63 |
|
---|
64 | 54
|
---|
65 | 55 */
|
---|
66 | 56
|
---|
67 | 57 /*
|
---|
68 | 58 =============================================================================
|
---|
69 | 59 read and update an Alcyon/GEMDOS format version message object file
|
---|
70 | 60 =============================================================================
|
---|
71 | 61 */
|
---|
72 | 62
|
---|
73 | 63 main()
|
---|
74 | 64 {
|
---|
75 | 65 short len, rc, vn, vp1, vp2;
|
---|
76 | 66
|
---|
77 | 67 len = sizeof verbuf;
|
---|
78 | 68
|
---|
79 | 69 /* first, read the old version message object file */
|
---|
80 | 70
|
---|
81 | 71 if ((FILE *)NULL EQ (fp = fopenb(VERFILE, "r"))) {
|
---|
82 | 72
|
---|
83 | 73 printf("ERROR -- Unable to open \"%s\" for reading (errno = %d)\n",
|
---|
84 | 74 VERFILE, errno);
|
---|
85 | 75
|
---|
86 | 76 exit(1);
|
---|
87 | 77 }
|
---|
88 | 78
|
---|
89 | 79 rewind(fp);
|
---|
90 | 80
|
---|
91 | 81 if (1 NE (rc = fread(&verbuf, len, 1, fp))) {
|
---|
92 | 82
|
---|
93 | 83 printf("ERROR -- Unable to read \"%s\" (rc = %d, errno = %d)\n",
|
---|
94 | 84 VERFILE, rc, errno);
|
---|
95 | 85
|
---|
96 | 86 if (ferror(fp))
|
---|
97 | 87 printf(" File system ERROR.\n");
|
---|
98 | 88 else if (feof(fp))
|
---|
99 | 89 printf(" Premature EOF.\n");
|
---|
100 | 90 else
|
---|
101 | 91 printf(" Neither ERROR or EOF set -- very odd\n");
|
---|
102 | 92
|
---|
103 | 93 fclose(fp);
|
---|
104 | 94 exit(1);
|
---|
105 | 95 }
|
---|
106 | 96
|
---|
107 | 97 fclose(fp);
|
---|
108 | 98 /* |
---|
109 |
|
---|
110 |
|
---|
111 | 1988-10-28 20:08:06 -- Page 3: NEWVER.C
|
---|
112 |
|
---|
113 |
|
---|
114 | 99
|
---|
115 | 100 */
|
---|
116 | 101
|
---|
117 | 102 /* next, set the date and version */
|
---|
118 | 103
|
---|
119 | 104 now(dtg); /* set date and time */
|
---|
120 | 105
|
---|
121 | 106 memcpy(&verstr[0], &dtg[0], 4);
|
---|
122 | 107 memcpy(&verstr[4], &dtg[5], 2);
|
---|
123 | 108 memcpy(&verstr[6], &dtg[8], 2);
|
---|
124 | 109 strcpy(&verstr[8], ".01");
|
---|
125 | 110
|
---|
126 | 111 if (memcmp(verbuf.ver, verstr, 8)) { /* if date is different ... */
|
---|
127 | 112
|
---|
128 | 113 strcpy(verbuf.ver, verstr); /* ... it's today's 1st version */
|
---|
129 | 114
|
---|
130 | 115 } else { /* ... otherwise, it's today's next version */
|
---|
131 | 116
|
---|
132 | 117 vn = ((verbuf.ver[ 9] - '0') * 10) +
|
---|
133 | 118 (verbuf.ver[10] - '0') + 1;
|
---|
134 | 119
|
---|
135 | 120 if (vn GE 100) { /* too many versions today ? */
|
---|
136 | 121
|
---|
137 | 122 printf("WARNING -- version number rolled over to 00.\n");
|
---|
138 | 123 vn = 0;
|
---|
139 | 124 }
|
---|
140 | 125
|
---|
141 | 126 vp1 = vn / 10;
|
---|
142 | 127 vp2 = vn - (vp1 * 10);
|
---|
143 | 128
|
---|
144 | 129 verbuf.ver[ 9] = vp1 + '0';
|
---|
145 | 130 verbuf.ver[10] = vp2 + '0';
|
---|
146 | 131 }
|
---|
147 | 132
|
---|
148 | 133 /* |
---|
149 |
|
---|
150 |
|
---|
151 | 1988-10-28 20:08:06 -- Page 4: NEWVER.C
|
---|
152 |
|
---|
153 |
|
---|
154 | 134
|
---|
155 | 135 */
|
---|
156 | 136 /* finally, re-write the version message object file */
|
---|
157 | 137
|
---|
158 | 138 if ((FILE *)NULL EQ (fp = fopenb(VERFILE, "w"))) {
|
---|
159 | 139
|
---|
160 | 140 printf("ERROR -- Unable to open \"%s\" for writing (errno = %d)\n",
|
---|
161 | 141 VERFILE, errno);
|
---|
162 | 142
|
---|
163 | 143 exit(1);
|
---|
164 | 144 }
|
---|
165 | 145
|
---|
166 | 146 rewind(fp);
|
---|
167 | 147
|
---|
168 | 148 if (1 NE (rc = fwrite(&verbuf, len, 1, fp))) {
|
---|
169 | 149
|
---|
170 | 150 printf("ERROR -- Unable to write to \"%s\" (rc = %d, errno = %d)\n",
|
---|
171 | 151 VERFILE, rc, errno);
|
---|
172 | 152
|
---|
173 | 153 if (ferror(fp))
|
---|
174 | 154 printf(" File system ERROR.\n");
|
---|
175 | 155 else if (feof(fp))
|
---|
176 | 156 printf(" Premature EOF.\n");
|
---|
177 | 157 else
|
---|
178 | 158 printf(" Neither ERROR or EOF set -- very odd\n");
|
---|
179 | 159
|
---|
180 | 160 fclose(fp);
|
---|
181 | 161 exit(1);
|
---|
182 | 162 }
|
---|
183 | 163
|
---|
184 | 164 fclose(fp);
|
---|
185 | 165 printf("Current version: %s\n", verbuf.ver);
|
---|
186 | 166 exit(0);
|
---|
187 | 167 }
|
---|
188 | |
---|
189 |
|
---|
190 |
|
---|
191 | 1988-10-28 20:08:42 -- Page 1: NOW.C
|
---|
192 |
|
---|
193 |
|
---|
194 | 1 /*
|
---|
195 | 2 =============================================================================
|
---|
196 | 3 now.c -- return the date and time as a string
|
---|
197 | 4 Version 2 -- 1988-10-28 -- D.N. Lynx Crowe
|
---|
198 | 5 (c) Copyright 1987, 1988 -- D.N. Lynx Crowe
|
---|
199 | 6 =============================================================================
|
---|
200 | 7 */
|
---|
201 | 8
|
---|
202 | 9 #define TESTER 0 /* define non-zero to get a test program */
|
---|
203 | 10
|
---|
204 | 11 #include "osbind.h"
|
---|
205 | 12
|
---|
206 | 13 /*
|
---|
207 | 14 =============================================================================
|
---|
208 | 15 now(p) -- return the date and time as a string in 'p'
|
---|
209 | 16
|
---|
210 | 17 Returns a pointer to the string provided, which must be at least
|
---|
211 | 18 21 bytes long. The string will be filled with the date and time
|
---|
212 | 19 in the format:
|
---|
213 | 20
|
---|
214 | 21 yyyy-mm-dd hh:mm:ss
|
---|
215 | 22
|
---|
216 | 23 with a trailing zero byte.
|
---|
217 | 24 =============================================================================
|
---|
218 | 25 */
|
---|
219 | 26
|
---|
220 | 27 char *
|
---|
221 | 28 now(p)
|
---|
222 | 29 char *p;
|
---|
223 | 30 {
|
---|
224 | 31 register long t;
|
---|
225 | 32 short yr, mn, dy, hh, mm, ss;
|
---|
226 | 33
|
---|
227 | 34 t = Gettime();
|
---|
228 | 35
|
---|
229 | 36 yr = ((short)(t >> 25) & 0x007F) + 1980;
|
---|
230 | 37 mn = (short)(t >> 21) & 0x000F;
|
---|
231 | 38 dy = (short)(t >> 16) & 0x001F;
|
---|
232 | 39
|
---|
233 | 40 hh = (short)(t >> 11) & 0x001F;
|
---|
234 | 41 mm = (short)(t >> 5) & 0x003F;
|
---|
235 | 42 ss = ((short)t & 0x001F) << 1;
|
---|
236 | 43
|
---|
237 | 44 sprintf(p, "%4d-%02d-%02d %02d:%02d:%02d", yr, mn, dy, hh, mm, ss);
|
---|
238 | 45
|
---|
239 | 46 return(p);
|
---|
240 | 47 }
|
---|
241 | 48
|
---|
242 | 49 /* |
---|
243 |
|
---|
244 |
|
---|
245 | 1988-10-28 20:08:42 -- Page 2: NOW.C
|
---|
246 |
|
---|
247 |
|
---|
248 | 50
|
---|
249 | 51 */
|
---|
250 | 52
|
---|
251 | 53 #if TESTER
|
---|
252 | 54
|
---|
253 | 55 char x[22]; /* buffer for the returned string */
|
---|
254 | 56
|
---|
255 | 57 /* simple test program for the now() function */
|
---|
256 | 58
|
---|
257 | 59 main()
|
---|
258 | 60 {
|
---|
259 | 61 printf("Date/Time = %s\n", now(x));
|
---|
260 | 62 exit(0);
|
---|
261 | 63 }
|
---|
262 | 64
|
---|
263 | 65 #endif
|
---|
264 | |
---|
265 |
|
---|
266 | {c}AS68 -s c:\bin\ -l -p verdate.s
|
---|
267 |
|
---|
268 | C P / M 6 8 0 0 0 A s s e m b l e r Revision 04.03 Page 1
|
---|
269 | Source File: VERDATE.S
|
---|
270 |
|
---|
271 | 1 * ------------------------------------------------------------------------------
|
---|
272 | 2 * verdate.s -- date and version ID message string
|
---|
273 | 3 * Version 1 -- 1988-10-28 -- D.N. Lynx Crowe
|
---|
274 | 4 * (c) Copyright 1988 -- D.N. Lynx Crowe -- All rights reserved
|
---|
275 | 5 * ------------------------------------------------------------------------------
|
---|
276 | 6 *
|
---|
277 | 7 * Version message string. Updated by 'newver.c' in object form to:
|
---|
278 | 8 *
|
---|
279 | 9 * 1. Automatically set the correct date and version
|
---|
280 | 10 * 2. Avoid the need for a compile or assembly
|
---|
281 | 11 *
|
---|
282 | 12 * 12 bytes -- 11 ASCII characters and a terminating zero byte
|
---|
283 | 13 *
|
---|
284 | 14 * char VerDate = "yyyymmdd.vv";
|
---|
285 | 15 * 0 byte
|
---|
286 | 16 * 0 1
|
---|
287 | 17 * 012345678901
|
---|
288 | 18 *
|
---|
289 | 19 * Use &VerDate[2] for yymmdd.vv format.
|
---|
290 | 20 *
|
---|
291 | 21 00000000 .data
|
---|
292 | 22 *
|
---|
293 | 23 .xdef _VerDate
|
---|
294 | 24 *
|
---|
295 | 25 00000000 3139383831303237 _VerDate: dc.b '19881027.01' * Date and version number
|
---|
296 | 25 00000008 2E3031
|
---|
297 | 26 0000000B 00 dc.b 0
|
---|
298 | 27 *
|
---|
299 | 28 0000000C .end
|
---|
300 | |
---|
301 | C P / M 6 8 0 0 0 A s s e m b l e r Revision 04.03 Page 2
|
---|
302 | Source File: VERDATE.S
|
---|
303 |
|
---|
304 | S y m b o l T a b l e
|
---|
305 |
|
---|
306 | _VerDate 00000000 DATA
|
---|
307 | |
---|
308 |
|
---|
309 |
|
---|
310 | 1988-10-28 20:11:32 -- Page 1: STDDEFS.H
|
---|
311 |
|
---|
312 |
|
---|
313 | 1 /*
|
---|
314 | 2 ============================================================================
|
---|
315 | 3 stddefs.h -- Standard definitions for C programs
|
---|
316 | 4 Version 12 -- 1987-12-15 -- D.N. Lynx Crowe
|
---|
317 | 5
|
---|
318 | 6 Must follow stdio.h if stdio.h is used as both define:
|
---|
319 | 7
|
---|
320 | 8 NULL, EOF.
|
---|
321 | 9
|
---|
322 | 10 Must follow define.h on the Atari if define.h is used as both define:
|
---|
323 | 11
|
---|
324 | 12 NULL, EOF, FOREVER, TRUE, FALSE, FAILURE, SUCCESS,
|
---|
325 | 13 YES, NO, EOS, NIL.
|
---|
326 | 14
|
---|
327 | 15 Released to Public Domain - 1987-06 - D.N. Lynx Crowe
|
---|
328 | 16 ============================================================================
|
---|
329 | 17 */
|
---|
330 | 18
|
---|
331 | 19 #ifndef STD_DEFS /* so we only define these once */
|
---|
332 | 20
|
---|
333 | 21 #define STD_DEFS 1
|
---|
334 | 22
|
---|
335 | 23 /* relational operators */
|
---|
336 | 24
|
---|
337 | 25 #define EQ ==
|
---|
338 | 26 #define NE !=
|
---|
339 | 27 #define GE >=
|
---|
340 | 28 #define LE <=
|
---|
341 | 29 #define GT >
|
---|
342 | 30 #define LT <
|
---|
343 | 31
|
---|
344 | 32 /* logical operators */
|
---|
345 | 33
|
---|
346 | 34 #define NOT !
|
---|
347 | 35 #define AND &&
|
---|
348 | 36 #define OR ||
|
---|
349 | 37
|
---|
350 | 38 /* infinite loop constructs */
|
---|
351 | 39
|
---|
352 | 40 #ifndef FOREVER
|
---|
353 | 41 #define FOREVER for(;;)
|
---|
354 | 42 #endif
|
---|
355 | 43
|
---|
356 | 44 #ifndef REPEAT
|
---|
357 | 45 #define REPEAT for(;;)
|
---|
358 | 46 #endif
|
---|
359 | 47
|
---|
360 | 48 /* |
---|
361 |
|
---|
362 |
|
---|
363 | 1988-10-28 20:11:32 -- Page 2: STDDEFS.H
|
---|
364 |
|
---|
365 |
|
---|
366 | 49
|
---|
367 | 50 */
|
---|
368 | 51
|
---|
369 | 52 /* various terminators */
|
---|
370 | 53
|
---|
371 | 54 #ifndef EOF
|
---|
372 | 55 #define EOF (-1)
|
---|
373 | 56 #endif
|
---|
374 | 57
|
---|
375 | 58 #ifndef EOS
|
---|
376 | 59 #define EOS '\0'
|
---|
377 | 60 #endif
|
---|
378 | 61
|
---|
379 | 62 #ifndef NIL
|
---|
380 | 63 #define NIL 0
|
---|
381 | 64 #endif
|
---|
382 | 65
|
---|
383 | 66 /* manifest constants for function return and flag values */
|
---|
384 | 67
|
---|
385 | 68 #ifndef NULL
|
---|
386 | 69 #define NULL 0
|
---|
387 | 70 #endif
|
---|
388 | 71
|
---|
389 | 72 #ifndef YES
|
---|
390 | 73 #define YES 1
|
---|
391 | 74 #endif
|
---|
392 | 75
|
---|
393 | 76 #ifndef NO
|
---|
394 | 77 #define NO 0
|
---|
395 | 78 #endif
|
---|
396 | 79
|
---|
397 | 80 #ifndef FALSE
|
---|
398 | 81 #define FALSE 0
|
---|
399 | 82 #endif
|
---|
400 | 83
|
---|
401 | 84 #ifndef TRUE
|
---|
402 | 85 #define TRUE 1
|
---|
403 | 86 #endif
|
---|
404 | 87
|
---|
405 | 88 #ifndef SUCCESS
|
---|
406 | 89 #define SUCCESS 0
|
---|
407 | 90 #endif
|
---|
408 | 91
|
---|
409 | 92 #ifndef FAILURE
|
---|
410 | 93 #define FAILURE (-1)
|
---|
411 | 94 #endif
|
---|
412 | 95
|
---|
413 | 96 /* BOOL type definition for flag variables */
|
---|
414 | 97
|
---|
415 | 98 typedef char BOOL;
|
---|
416 | 99
|
---|
417 | 100 #endif
|
---|
418 | |
---|
419 |
|
---|
420 |
|
---|
421 | 1988-10-28 20:11:32 -- Page 1: OBJDEFS.H
|
---|
422 |
|
---|
423 |
|
---|
424 | 1 /*
|
---|
425 | 2 ============================================================================
|
---|
426 | 3 objdefs.h -- Object file format for as68 (Atari 1040ST TOS objects)
|
---|
427 | 4 Version 7 -- 1987-12-30 -- D.N. Lynx Crowe
|
---|
428 | 5 ============================================================================
|
---|
429 | 6 */
|
---|
430 | 7
|
---|
431 | 8 struct EXFILE { /* executable file header */
|
---|
432 | 9
|
---|
433 | 10 unsigned F_Magic; /* File type magic */
|
---|
434 | 11 long F_Text; /* SIze of text segment */
|
---|
435 | 12 long F_Data; /* Size of data segment */
|
---|
436 | 13 long F_BSS; /* Size of BSS segment */
|
---|
437 | 14 long F_Symtab; /* Size of symbol table */
|
---|
438 | 15 long F_Res1; /* Reserved area #1 */
|
---|
439 | 16 long F_Res2; /* Reserved area #2 -- text origin */
|
---|
440 | 17 unsigned F_Res3; /* Reserved area #3 -- flag word */
|
---|
441 | 18
|
---|
442 | 19 /* data origin - long */
|
---|
443 | 20 /* bss origin - long */
|
---|
444 | 21 };
|
---|
445 | 22
|
---|
446 | 23 #define F_R_C 0x601A /* Magic for contiguous file */
|
---|
447 | 24 #define F_R_D 0x601B /* Magic for discontiguous file */
|
---|
448 | 25
|
---|
449 | 26 struct SYMBOL { /* Symbol table entry -- 14 bytes */
|
---|
450 | 27
|
---|
451 | 28 char symname[8]; /* Symbol name (LJZF) */
|
---|
452 | 29 unsigned symtype; /* Symbol type flags */
|
---|
453 | 30 long symvalue; /* Symbol value */
|
---|
454 | 31 };
|
---|
455 | 32
|
---|
456 | 33 #define S_Def 0x8000 /* Defined */
|
---|
457 | 34 #define S_Equ 0x4000 /* Equated */
|
---|
458 | 35 #define S_Glb 0x2000 /* Global */
|
---|
459 | 36 #define S_Reg 0x1000 /* Equated register */
|
---|
460 | 37 #define S_Ext 0x0800 /* External reference */
|
---|
461 | 38 #define S_Data 0x0400 /* Data based relocatable */
|
---|
462 | 39 #define S_Text 0x0200 /* Text based relocatable */
|
---|
463 | 40 #define S_BSS 0x0100 /* BSS based relocatable */
|
---|
464 | |
---|
465 |
|
---|
466 | Directory of C:\CPROGS
|
---|
467 |
|
---|
468 | VERDATE.O 10/28/88 20:10:12 000 66
|
---|
469 | Done.
|
---|
470 |
|
---|
471 | ================================================================================
|
---|
472 |
|
---|
473 | Dump of: verdate.o
|
---|
474 |
|
---|
475 | 0000 00 (000000): 601A 0000 0000 0000 000C 0000 0000 0000 *`...............*
|
---|
476 | 0000 10 (000010): 000E 0000 0000 0000 0000 0000 3139 3838 *............1988*
|
---|
477 | 0000 20 (000020): 3130 3237 2E30 3100 5F56 6572 4461 7465 *1027.01._VerDate*
|
---|
478 | 0000 30 (000030): A400 0000 0000 0000 0000 0000 0000 0000 *$...............*
|
---|
479 | 0000 40 (000040): 0000 0000 0000 0000 0000 0000 0000 0000 *................*
|
---|
480 |
|
---|
481 | *** E O F ***
|
---|
482 |
|
---|
483 | ================================================================================
|
---|
484 |
|
---|
485 | Sample C program usage:
|
---|
486 | -----------------------
|
---|
487 |
|
---|
488 | #define PGMID "test" /* program name, since argv[0] isn't */
|
---|
489 |
|
---|
490 | extern char now(); /* get system date and time as a string */
|
---|
491 |
|
---|
492 | extern char VerDate[]; /* program date and version string */
|
---|
493 |
|
---|
494 | char dtg[22]; /* today's date and time */
|
---|
495 |
|
---|
496 | main(argc, argv)
|
---|
497 | int argc;
|
---|
498 | char *argv[];
|
---|
499 | {
|
---|
500 | /* identify the program and version */
|
---|
501 |
|
---|
502 | printf("%s -- Version %s\n",
|
---|
503 | PGMID, VerDate);
|
---|
504 |
|
---|
505 | /* log the run date and time */
|
---|
506 |
|
---|
507 | printf("Run date and time: %s\n",
|
---|
508 | now(dtg));
|
---|
509 |
|
---|
510 | /* ***** program goes here ***** */
|
---|
511 |
|
---|
512 | exit(0);
|
---|
513 | }
|
---|
514 | |
---|
515 |
|
---|