Listing 5 Function strfdate

/***************************************************************/
/*            (c) Copyright 1993 by Stan Milam                */
/*                                                             */
/*                         strfdate()                            */
/*                                                             */
/* This is the main function in the file. It uses format char- */
/* acters to format the date any way we want it in a supplied  */
/* memory address.                                             */
/*                                                             */
/* Arguments:                                                   */
/*   char *buffer - Memory address where we place the formatted*/
/*                  date.                                      */
/*   unsigned size- Max size of the buffer. We do not exceed.  */
/*   char *format - The format string. Characters preceeded    */
/*                  by the % character are taken to be format  */
/*                  specifiers. The format specifiers are:     */
/*                                                             */
/*                    %a - Format abbreviated weekday name.      */
/*                    %A - Full weekday name.                    */
/*                    %b - Format abbreviated month name.        */
/*                    %B - Format full month name.               */
/*                    %d - Format the day of the month (01-31).  */
/*                    %j - The day of the year (001 - 366).      */
/*                    %m - The month of the year (01 - 12).      */
/*                    %U - The week of year (00 - 52, Sunday)    */
/*                    %w - The day of week (0 - 6, Sunday = 0)   */
/*                    %W - The week of year (00 - 52, Monday).   */
/*                    %x - The date (MM/DD/CCYY).                */
/*                    %y - Formats a two digit year.             */
/*                    %Y - Formats the four digit year.          */
/*                                                             */
/*  struct dt *dr - A pointer to the dt structure populated    */
/*                  with the localdate() function.             */
/*                                                             */
/***************************************************************/

unsigned strfdate( char *buffer, unsigned size, char *format, struct dt *dt )
{
   
   size_t    len;
   int       start;
   unsigned  rv = 0;
   char      wrkbuf[15];
   char      *src = format;
   char      *dest= buffer;

   /************************************************************/
   /* Enter a loop copying characters from the format string   */
   /* into the buffer unless it is a format character.         */
   /************************************************************/

   while ( *src && size ) {
      if ( *src != '%' ) {
         *dest++ = *src++;
         size--; rv++;
      }
      else {
         len = 0;
         /****************************************************/
         /* We have a format character so we handle it.      */
         /****************************************************/

         switch( *++src ) {

            /************************************************/
            /* Just in case there is nothing following!     */
            /************************************************/

            case '\0' :
               continue;

            /***********************************************/
            /* Format the abbreviated weekday name.        */
            /***********************************************/

            case 'a' :
               len = 3;
               if ( len > size ) len = size;
               strncpy(dest, full_weekday[dt -> dt_wday], len );
               break;

            /***********************************************/
            /* Format the full name of the week.           */
            /***********************************************/

            case 'A' :
               len = strlen( full_weekday[dt -> dt_wday] );
               if ( len > size ) len = size;
               strncpy( dest, full_weekday[dt->dt_wday], len);
               break;

            /***********************************************/
            /* Format the abbreviated name of the month.   */
            /***********************************************/

            case 'b' :
               len = 3;
               if ( len > size ) len = size;
               strncpy(dest, full_month[dt -> dt_month], len);
               break;

            /***********************************************/
            /* Format the full name of the month.          */
            /***********************************************/

            case 'B' :
               len = strlen(full_month[dt -> dt_month]);
               if ( len > size ) len = size;
               strncpy(dest, full_month[dt -> dt_month], len);
               break;

            /***********************************************/
            /* Format the day of the month.                */
            /***********************************************/

            case 'd' :
               len = sprintf(wrkbuf, "%02d", dt -> dt_mday);
               if ( len > size ) len = size;
               strncpy(dest, wrkbuf, len);
               break;

            /***********************************************/
            /* Format the day of the year (001 - 366).     */
            /***********************************************/

            case 'j' :
               len = sprintf(wrkbuf, "%03d", dt -> dt_yday + 1);
               if ( len > size ) len = size;
               strncpy(dest, wrkbuf, len);
               break;

            /***********************************************/
            
           /* Format the month of the year (01 - 12).     */
            /***********************************************/

            case 'm' :
               len = sprintf(wrkbuf, "%02d", dt -> dt_month + 1);
               if ( len > size ) len = size;
               strncpy(dest, wrkbuf, len);
               break;

            /***********************************************/
            /* Formats the week of the year. %U starts the */
            /* week with Sunday, %W starts the week with a */
            /* Monday.                                     */
            /***********************************************/

            case 'U' :
            case 'W' :
               start = (*src == 'U') ? 1 : 0; 
               len = sprintf(wrkbuf, "%02d", week_of_year(start, dt -> dt_wday,
                               dt->dt_yday));
               if ( len > size ) len = size;
               strncpy(dest, wrkbuf, len);
               break;

            /***********************************************/
            /* Format the day of the week (1 - 6).         */
            /***********************************************/

            case 'w':
               len = sprintf(wrkbuf, "%d", dt -> dt_wday);
               if ( len > size ) len = size;
               strncpy( dest, wrkbuf, len );
               break;

            /***********************************************/
            /* Formats a traditional Gregorian date with   */
            /* single exception: The year is four digits.  */
            /***********************************************/

            case 'x' :
               len = sprintf(wrkbuf, "%02d/%02d/%04d",
                           dt -> dt_month + 1, dt -> dt_mday,
                           dt -> dt_year);
               if (len > size) len = size;
               strncpy(dest, wrkbuf, len);
               break;

            /***********************************************/
            /* Formats the year in at least four digits.   */
            /***********************************************/

            case 'Y' :
               len = sprintf(wrkbuf, "%04d", dt -> dt_year);
            if ( len > size ) len = size;
            strncpy(dest, wrkbuf, len);
            break;

            /***********************************************/
            /* Format the year without the century.        */
            /***********************************************/

            case 'y' :
               len = sprintf(wrkbuf, "%02d", dt -> dt_year % 100);
               if ( len > size ) len = size;
               strncpy(dest, wrkbuf, len);
               break;

            /***********************************************/
            /* User may want a % character in the output.  */
            /***********************************************/

            case '%' :
               len = 1;
               if (len > size) len = size;
               else *dest = '%';
               break;

         } /* Switch */

         src += 1;
         rv += len;
         dest += len;
         size -= len;
      } /* while */
   }
   if ( size ) *dest = '\0';
   return rv;
}
/* End of File */