jchvr@ihlpg.UUCP (06/04/87)
Please find below a MSDOs version of TOUCH for lattice-c
Please use or abuse at your own risk.
h.f. van Rietschote
mcvax!ihnp4!hvlpa!hvrietsc
#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*/