home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume3 / date / date.c < prev   
Encoding:
C/C++ Source or Header  |  1986-11-30  |  4.5 KB  |  338 lines

  1. #include <stdio.h>
  2. #include <sys/time.h>
  3.  
  4. char *dayshort[] = {
  5.     "Mon",
  6.     "Tue",
  7.     "Wed",
  8.     "Thu",
  9.     "Fri",
  10.     "Sat",
  11.     "Sun"
  12. };
  13.  
  14. char *monthshort[] = {
  15.     "Jan",
  16.     "Feb",
  17.     "Mar",
  18.     "Apr",
  19.     "May",
  20.     "Jun",
  21.     "Jul",
  22.     "Aug",
  23.     "Sep",
  24.     "Oct",
  25.     "Nov",
  26.     "Dec"
  27. };
  28.  
  29. char *days[] = {
  30.     "monday",
  31.     "tuesday",
  32.     "wednesday",
  33.     "thursday",
  34.     "friday",
  35.     "saturday",
  36.     "sunday"
  37. };
  38.  
  39. char *months[] = {
  40.     "january",
  41.     "february",
  42.     "march",
  43.     "april",
  44.     "may",
  45.     "june",
  46.     "july",
  47.     "august",
  48.     "september",
  49.     "october",
  50.     "november",
  51.     "december"
  52. };
  53.  
  54. char *jrs[] = {
  55.     "lun",
  56.     "mar",
  57.     "mer",
  58.     "jeu",
  59.     "ven",
  60.     "sam",
  61.     "dim"
  62. };
  63.  
  64. char *ms[] = {
  65.     "jan",
  66.     "fev",
  67.     "mar",
  68.     "avr",
  69.     "mai",
  70.     "juin",
  71.     "juil",
  72.     "aou",
  73.     "sep",
  74.     "oct",
  75.     "nov",
  76.     "dec"
  77. };
  78.  
  79. char *jours[] = {
  80.     "lundi",
  81.     "mardi",
  82.     "mercredi",
  83.     "jeudi",
  84.     "vendredi",
  85.     "samedi",
  86.     "dimanche"
  87. };
  88.  
  89. char *mois[] = {
  90.     "janvier",
  91.     "fevrier",
  92.     "mars",
  93.     "avril",
  94.     "mai",
  95.     "juin",
  96.     "juillet",
  97.     "aout",
  98.     "septembre",
  99.     "octobre",
  100.     "novembre",
  101.     "decembre"
  102. };
  103.  
  104. main( argc, argv)
  105.  
  106. int    argc;
  107. char    **argv;
  108.  
  109. {    long    l;
  110.  
  111.     int     i, j,
  112.         fflg, lflg,
  113.         iday, imonth;
  114.  
  115.     char    *word[7],
  116.         format[80],
  117.         *command,
  118.         *date,
  119.         day[15],
  120.         month[15],
  121.         daymonth[3],
  122.         hour[3],
  123.         minute[3],
  124.         second[3],
  125.         year[5];
  126.  
  127. /* get date                */
  128.  
  129.     time(&l);
  130.     date = ctime(&l);
  131.  
  132. /* print date and exit, if no argument    */
  133.  
  134.     if (argc == 1) {
  135.         printf( "%s", date);
  136.         exit(0);
  137.     }
  138.  
  139. /* save name of command            */
  140.  
  141.     command = argv[0];
  142.  
  143. /* get options if any            */
  144.  
  145.     argc--;    argv++;
  146.     lflg = fflg = 0;
  147.     while(argv[0][0] == '-' && argv[0][1]) {
  148.         for( i=1; argv[0][i]; i++)
  149.         switch(argv[0][i]) {
  150.  
  151.         case 'f':
  152.             fflg++;
  153.             break;
  154.  
  155.         case 'l':
  156.             lflg++;
  157.             break;
  158.  
  159.         default:
  160.             fprintf( stderr,
  161.             "%s : bad option %c\n", command, argv[0][i]);
  162.         }
  163.         argc--; argv++;
  164.     }
  165.     if (argv[0][0] == '-') {
  166.         argc--; argv++;
  167.     }
  168.  
  169. /* initialize day, month, ...        */
  170.  
  171.     substrcpy( date,  0,  2, day);
  172.     substrcpy( date,  4,  6, month);
  173.     if (date[8] == ' ') {
  174.         daymonth[0] = date[9];
  175.         daymonth[1] = '\0';
  176.         }
  177.     else
  178.         substrcpy( date,  8,  9, daymonth);
  179.     substrcpy( date, 11, 12, hour);
  180.     substrcpy( date, 14, 15, minute);
  181.     substrcpy( date, 17, 18, second);
  182.     substrcpy( date, 20, 23, year);
  183.  
  184.  
  185. /* compute iday, imonth            */
  186.  
  187.     for( iday=0; iday<7; iday++) 
  188.         if (!strncmp( dayshort[iday], day, 3)) break;
  189.     for( imonth=0; imonth<12; imonth++) 
  190.         if (!strncmp( monthshort[imonth], month, 3)) break;
  191.  
  192. /* look for french and/or long output    */
  193.  
  194.     if (fflg)
  195.         if (lflg) {
  196.         strcpy( day,   jours[iday]);
  197.         strcpy( month, mois[imonth]);
  198.         }
  199.         else {
  200.         strcpy( day,   jrs[iday]);
  201.         strcpy( month, ms[imonth]);
  202.         }
  203.     else
  204.         if (lflg) {
  205.         strcpy( day,   days[iday]);
  206.         strcpy( month, months[imonth]);
  207.         }
  208.  
  209. /* check number of arguments        */
  210.  
  211.     if (argc == 1 || argc > 8) {
  212.         fprintf( stderr,
  213.         "%s : wrong number of arguments\n", command);
  214.         exit(1);
  215.     }
  216.  
  217.     if (argc) {
  218.  
  219. /* translate C convention like \n, \t, ...
  220.    into single char.            */
  221.  
  222.         for ( i=0, j=0; argv[0][i]; i++, j++) {
  223.         format[j] = argv[0][i];
  224.         if (argv[0][i] == '\\') 
  225.             switch (argv[0][++i]) {
  226.  
  227.             case 'n':
  228.                 format[j] = '\n';
  229.                 break;
  230.  
  231.             case 't':
  232.                 format[j] = '\t';
  233.                 break;
  234.  
  235.             case 'b':
  236.                 format[j] = '\b';
  237.                 break;
  238.  
  239.             case 'r':
  240.                 format[j] = '\r';
  241.                 break;
  242.  
  243.             case 'f':
  244.                 format[j] = '\f';
  245.                 break;
  246.  
  247.             case '\\':
  248.                 break;
  249.  
  250.             default:
  251.                 format[++j] = argv[0][i];
  252.             }
  253.         }
  254.         format[j] = '\0';
  255.         argc--; argv++;
  256.  
  257. /* order arguments            */
  258.  
  259.         for( i=0; i<7; i++) word[i] = '\0';
  260.         j = 0;
  261.         while (argc) {
  262.         for( i=0; argv[0][i]; i++)
  263.             switch(argv[0][i]) {
  264.  
  265.             case 'd':
  266.             case 'j':
  267.                 word[j++] = day;
  268.                 break;
  269.  
  270.             case 'M':
  271.                 word[j++] = month;
  272.                 break;
  273.  
  274.             case 'D':
  275.             case 'J':
  276.                 word[j++] = daymonth;
  277.                 break;
  278.  
  279.             case 'h':
  280.                 word[j++] = hour;
  281.                 break;
  282.  
  283.             case 'm':
  284.                 word[j++] = minute;
  285.                 break;
  286.  
  287.             case 's':
  288.                 word[j++] = second;
  289.                 break;
  290.  
  291.             case 'A':    
  292.             case 'Y':    
  293.                 word[j++] = year;
  294.                 break;
  295.  
  296.             case ',':
  297.                 break;
  298.  
  299.             default:    
  300.                 fprintf( stderr,
  301.                 "%s : bad argument %c\n", command, argv[0][i]);
  302.             }
  303.         argc--;    argv++;
  304.         }
  305.  
  306. /* output date according to format    */
  307.  
  308.         printf( format, word[0], word[1], word[2],
  309.             word[3], word[4], word[5], word[6]);
  310.         }
  311.  
  312.     else {
  313.  
  314.         strcpy( format, "%s %s %s %s   %s:%s:%s\n");
  315.         if (fflg)
  316.         printf( format, day, daymonth, month, year, hour, minute, second);
  317.         else
  318.         printf( format, day, month, daymonth, year, hour, minute, second);
  319.     }
  320. }
  321.  
  322.  
  323. /* copy string str1[n..m] into str2    */
  324.  
  325. substrcpy( str1, n, m, str2)
  326.  
  327. int    n, m;
  328. char    *str1, *str2;
  329.  
  330. {
  331.     m++;
  332.     if ( n >= 0 && m >= n ) {
  333.         while( n-- && *str1++ && m--);
  334.         while( m-- && ( *str2++ = *str1++ ));
  335.     }
  336.     *str2='\0';
  337. }
  338.