#include #include /* * http://groups.google.de/group/comp.unix.shell/msg/72bbc641422fdf73?dmode=source&hl=de */ /************************************************************************/ long klok, /* date and time long integer */ calc_time(); /* time calculating procedure */ char format[80], /* formatting string */ *argv0, /* name of this command */ *getenv(); /* environment procedure */ /************************************************************************/ main (argc, argv) int argc; char *argv[]; { char *cp; int index; *format = 0; klok = time(0L); argv0 = argv[0]; /********** retreive offset and formating from command-line *********/ for (index = 1; index < argc ; index++) { if (*argv[index] == '+') /* if parameter starts */ { /* with a '+' */ cp = argv[index]; while (*cp != 0 && *cp != '%') /* search for a '%' */ cp++; if (*cp == '%') /* if a '%' found assume*/ strcpy(format,argv[index]); /* this is a format str.*/ else /* else */ klok = calc_time(argv[index],klok); /* calculate new time */ } else if (*argv[index] == '-') klok = calc_time(argv[index],klok); /* calculate new time */ else if (sscanf(argv[index],"%ld",&klok) < 0) { fprintf(stderr,"%s: Illegal argument\n",argv[index]); usage(); } } printformatted(klok,format); } /************************************************************************/ /* Procedure OFFSET - Calculate offset */ /************************************************************************/ long calc_time(str,ck) char *str; long ck; { int sign = 1, /* sign of offset (pos./neg.) */ offset; /* nr. of days,hours,weeks... */ char type; /* type of offset */ if (*(str++) == '-') /* determine sign */ sign = -1; if (sscanf(str,"%u%c",&offset,&type) <= 0) { fprintf(stderr,"%s: Syntax error in offset\n",argv0); usage(); } switch (type) { case 'd' : return(ck + sign * 86400 * offset); /* days */ case 'h' : return(ck + sign * 3600 * offset); /* hours */ case 'm' : return(ck + sign * 60 * offset); /* minutes */ case 's' : return(ck + sign * offset); /* seconds */ default : fprintf(stderr,"%s: Unknown offset type \'%c\'\n",argv0,type); usage(); } } /************************************************************************/ printformatted (cl,fo) long cl; char *fo; { struct tm *timestruct; char *pntr, *timestring; timestruct = localtime(&cl); timestring = ctime(&cl); if (*fo) { for (pntr = fo + 1; *pntr ; pntr++) { if (*pntr == '%') { switch (*(++pntr)) { case 'n' : printf("\n"); break; case 't' : printf("\t"); break; case 'm' : printf("%.2u",timestruct->tm_mon + 1); break; case 'd' : printf("%.2u",timestruct->tm_mday); break; case 'y' : printf("%.2u",timestruct->tm_year % 100); break; case 'D' : printf("%.2u/%.2u/%.2u",timestruct->tm_mon + 1, timestruct->tm_mday, timestruct->tm_year); break; case 'H' : printf("%.2u",timestruct->tm_hour); break; case 'M' : printf("%.2u",timestruct->tm_min); break; case 'S' : printf("%.2u",timestruct->tm_sec); break; case 'T' : printf("%.2u:%.2u:%.2u",timestruct->tm_hour, timestruct->tm_min, timestruct->tm_sec); break; case 'j' : printf("%.3u",timestruct->tm_yday); break; case 'w' : printf("%.1u",timestruct->tm_wday); break; case 'a' : printf("%3.-3s",timestring); break; case 'h' : printf("%3.-3s",timestring + 4); break; case 'r' : if (timestruct->tm_hour > 12) { printf("%.2u:",timestruct->tm_hour - 12); printf("%.2u:",timestruct->tm_min); printf("%.2u PM",timestruct->tm_sec); } else { printf("%.2u:",timestruct->tm_hour); printf("%.2u:",timestruct->tm_min); printf("%.2u AM",timestruct->tm_sec); } break; default: usage(); } } else printf("%c",*pntr); } printf("\n"); } else { printf("%19.-19s ",timestring); printf("%3.-3s ",getenv("TZ")); printf("%4.-4s\n",×tring[20]); } } /************************************************************************/ static usage () { #define E(x) fprintf(stderr,"%s\n",x) E(" Usage: xdate [CALCULATION] [+FORMAT]"); E("CALCULATION can be used for date calculation. It can be:"); E("+|- d|h|m|s for +/- Days, Hours, Minutes, Seconds"); E("FORMAT determines the print-format of the result. They are"); E("%n - Newline"); E("%t - Tab"); E("%m - Month (01 -12)"); E("%d - Day (01 - 31)"); E("%y - YY (00 -99)"); E("%D - MM/DD/YY"); E("%H - Hour (00 - 24)"); E("%M - Minute (00 - 60)"); E("%S - Seconds (00 - 60)"); E("%T - HH:MM:SS"); E("%j - Daynumber in year (000 - 365)"); E("%w - Daynumber in week (0 - 6, 0 = Sunday)"); E("%a - Day name (Sun, Mon...)"); E("%h - Month name (Jan, Feb..)"); E("%r - HH:MM:SS [AM|PM]"); exit(1); }