jchvr@ihlpg.ATT.COM (Hartong) (09/23/87)
No garantees but here is the lattice c source for touch.c (see your local unix system on what touch is supposed to do). #include <stdio.h> #include <dos.h> #define CARRY 1 #ifdef min #undef min #endif static union REGS rg; static int flags; static char ar[256]; int create=0; /* 0= create, !=0 is do not create file */ int notdone=0; /* number of files not done */ struct TIME { int day; int wkday; int month; int year; int hour; int min; int sec; }; doit(name,day,month,year,hour,min,sec) char name[]; int day,month,year,hour,min,sec; { int handle; byte hi,lo; /* check date */ year = year - 1980; sec = 0; if ( (year < 0) || (year > 199)) goto error; if ( (month< 0) || (month> 12 )) goto error; if ( (day < 0) || (day > 31 )) goto error; if ( (hour < 0) || (hour > 23 )) goto error; if ( (min < 0) || (min > 59 )) goto error; goto okay; error: fprintf(stderr,"touch : ERROR : illegal date\n"); exit(1); okay: strcpy(ar,name); /* Open file Handle pg:7-120 */ rg.h.ah = 0x3d; /* open file handle */ rg.h.al = 0; /* open for read */ rg.x.dx = &(ar[0]); /* pointer to pathname */ flags = intdos(&rg, &rg); handle = rg.x.ax; if ( (flags & CARRY) != 0) { switch (handle) { case 2 : fprintf(stderr,"%s not found\n",name); break; case 4 : fprintf(stderr,"Too many open files\n"); break; case 5 : fprintf(stderr,"Access denied on %s\n",name); break; case 12 : fprintf(stderr,"Invalid access on %s\n",name); break; default : fprintf(stderr,"Unknown error on %s\n",name); break; } notdone++; return(-1); } /* compute values for DX */ lo = month & 7 ; /* take 3 right most bits */ lo = lo << 5; lo = lo | day; hi = year & 0x7f; hi = hi << 1; hi = hi | ( (month>>3) & 0xff); rg.h.dl = lo; rg.h.dh = hi; lo = min & 7; lo = lo << 5; lo = lo | sec; hi = hour & 31; hi = hi << 3; hi = hi | ( (min>>3) & 0xff); rg.h.cl = lo; rg.h.ch = hi; /* set date and time */ rg.h.ah = 0x57; /* get/set date/time of file */ rg.h.al = 1; /* set time/date */ rg.x.bx = handle; flags = intdos(&rg, &rg); if ( (flags & CARRY) != 0 ) { fprintf(stderr,"Cannot touch %s\n",name); notdone++; } /* close file handle */ rg.h.ah = 0x3e; /* close file */ rg.x.bx = handle; intdos(&rg, &rg); }/*doit*/ gettime(ptr) struct TIME *ptr; { rg.h.ah = 0x2a; /* get date */ intdos(&rg, &rg); ptr->year = rg.x.cx; ptr->month= rg.h.dh; ptr->day = rg.h.dl; ptr->wkday= rg.h.al; rg.h.ah = 0x2c; /* get time */ intdos(&rg, &rg); ptr->hour = rg.h.ch; ptr->min = rg.h.cl; ptr->sec = rg.h.dh; }/*gettime*/ #define length(i) strlen(i) #define add(i,j) ((s[(i)]-'0')*10 + (s[(j)]-'0')) getarg(s,t) char s[]; struct TIME *t; { int i; if ( (length(s) != 10) && (length(s) != 8) ) { fprintf(stderr,"Illegal date\n"); exit(1); } for (i=0; i<length(s); i++) { if ( (s[i] < '0') || (s[i] > '9') ) { fprintf(stderr,"Illegal date\n"); exit(1); } } gettime(t); if ( length(s) == 10 ) { t->year = 1900 + add(8,9); } t->month = add(0,1); t->day = add(2,3); t->hour = add(4,5); t->min = add(6,7); }/*getarg*/ main(argc,argv) int argc; char *argv[]; { int i; struct TIME t; FILE *f; char c; int start; #if MSDOS _parseall(&argc,argv,1); #endif if ( argc <= 1 ) { fprintf(stderr,"Usage: touch file [file ...]\n"); exit(0); } start = 1; /* check for -c option ignore all others */ c = argv[start][0]; /* take first char */ if (c == '-') { start++; if (argv[start][1] == 'c') create++; } /* check for MMddhhmm[yy] any digit will do */ c = argv[start][0]; /* take first char */ if ( (c >= '0') && (c <= '9') ) { start++; getarg(argv[start],&t); } else { gettime(&t); } for (i=start; i<argc; i++) { if (create == 0 ) { f = fopen(argv[i],"a"); fclose(f); } doit(argv[i],t.day,t.month,t.year,t.hour,t.min,t.sec); } exit(notdone); }/*main*/
swh@hpsmtc1.HP.COM (Steve Harrold) (09/24/87)
Re: Lattice-C for 'touch' Seems like a lot of finagling to actually update the file's timestamp. Just use Microsoft C and the 'utime' library function to do it. --------------------- Steve Harrold ...hplabs!hpsmtc1!swh HPG200/13 (408) 447-5580 ---------------------
martyl@rocksvax.UUCP (10/03/87)
Wow -- I was impressed at how code can expand to fill available space. When I found I needed to have a copy of touch on a ms-dos system when I first needed one, I whipped this up in a few minutes (it has no c or f options) -- /* File: touch.c - created by Marty Leisner */ /* leisner.Henr 14-Mar-87 15:11:35 */ /* Copyright (C) 1987 by Martin Leisner. All rights reserved. */ /* something like unix touch */ #include <stdio.h> main(argc, argv) int argc; char *argv[]; { while(--argc) { argv++; if(utime(*argv, NULL)) printf("can't update file %s\n", *argv); } } I first used open and close on the files (which I believe forces a dos timestamp, but then I found out Aztec supports the utime function. It did the job. -- marty leisner xerox corp leisner.henr@xerox.com martyl@rocksvax.uucp