All pastes #415027 Raw Edit

xdate.c

public c v1 · immutable
#415027 ·published 2007-03-29 13:55 UTC
rendered paste body
#include <stdio.h>#include <time.h>/* * 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",&timestring[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);}