[3ae31e9] | 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 |
|
---|