| iMatix home page
| << | < | > | >>
SFL Logo SFL
Version 2.11

 

conv_date_str

#include "sflconv.h"
char *
conv_date_str (
    long date,
    int  flags,
    int  format,
    int  order,
    char datesep,
    int  width)

Synopsis

Converts a date to a string. The format argument defines how the date is shown:
DATE YMD COMPACT ddmmyy
DATE YMD SLASH dd/mm/yy
DATE YMD SPACE dd mm yy
DATE YMD COMMA dd mm, yy (DM,Y or MD,Y or Y,MD)
DATE YM COMPACT mmyy
DATE YM SLASH mm/yy
DATE YM SPACE mm yy
DATE MD COMPACT ddmm
DATE MD SLASH dd/mm
DATE MD SPACE dd mm
The date order (year/month/day) is normally supplied in the order argument. However, the date flags can override this. The flags are:
FLAG D DD AS D Show day without leading zero
FLAG D MM AS M Show month without leading zero
FLAG D MONTH ABC Show month as letters (fullname if width > 16)
FLAG D CENTURY Show year as four digits
FLAG D UPPERCASE Month name in uppercase
FLAG D ORDER DMY Order is DMY for this date
FLAG D ORDER MDY Order is MDY for this date
FLAG D ORDER YMD Order is YMD for this date
Returns a pointer to a static area holding the string, or NULL if there was an error (for instance, formatted date greater than width).

Source Code - (sflcvds.c)

{
    static char *format_table [] = {
        "ymd",    "dmy",    "mdy",      /*  DATE_YMD_COMPACT                 */
        "y/m/d",  "d/m/y",  "m/d/y",    /*  DATE_YMD_DELIM                   */
        "y m d",  "d m y",  "m d y",    /*  DATE_YMD_SPACE                   */
        "y, m d", "d m, y", "m d, y",   /*  DATE_YMD_COMMA                   */
        "ym",     "my",     "my",       /*  DATE_YM_COMPACT                  */
        "y/m",    "m/y",    "m/y",      /*  DATE_YM_DELIM                    */
        "y m",    "m y",    "m y",      /*  DATE_YM_SPACE                    */
        "md",     "dm",     "md",       /*  DATE_MD_COMPACT                  */
        "m/d",    "d/m",    "m/d",      /*  DATE_MD_DELIM                    */
        "m d",    "d m",    "m d"       /*  DATE_MD_SPACE                    */
    };
    char
        *format_ptr,                    /*  Scan through format string       */
        delim [2],                      /*  Delimiter character              */
        picture [14],                   /*  Largest picture: dd mmmm, yyyy   */
        ch;                             /*  Next char in format string       */
    int
        index,
        date_order = order;             /*  Order to use                     */

    ASSERT (format >= DATE_FORMAT_FIRST && format <= DATE_FORMAT_LAST);
    ASSERT (order  >= DATE_ORDER_FIRST  && order  <= DATE_ORDER_LAST);

    conv_reason = 0;                    /*  No conversion errors so far      */

    if (flags & FLAG_D_ORDER_YMD)
        date_order = DATE_ORDER_YMD;
    else
    if (flags & FLAG_D_ORDER_DMY)
        date_order = DATE_ORDER_DMY;
    else
    if (flags & FLAG_D_ORDER_MDY)
        date_order = DATE_ORDER_MDY;

    /*  Get index into table                                                 */
    index = format * 3 + date_order - 1;

    /*  Now build-up picture according to format string                      */
    strclr (picture);
    for (format_ptr = format_table [index]; *format_ptr; format_ptr++)
      {
        ch = *format_ptr;
        switch (ch)
          {
            case 'y':
                strcat (picture, flags & FLAG_D_CENTURY? "yyyy": "yy");
                break;

            case 'm':
                if (flags & FLAG_D_MONTH_ABC)
                    if (width > 16)
                        strcat (picture, flags & FLAG_D_UPPER? "MMMM": "mmmm");
                    else
                        strcat (picture, flags & FLAG_D_UPPER? "MMM": "mmm");
                else
                    strcat (picture, flags & FLAG_D_MM_AS_M? "m": "mm");
                break;

            case 'd':
                strcat (picture, flags & FLAG_D_DD_AS_D? "d": "dd");
                break;

            case '/':
                ch = datesep;           /*  Use supplied date separator      */
            default:
                delim [0] = ch;
                delim [1] = 0;
                strcat (picture, delim);
          }
      }
    format_ptr = conv date pict (date, picture);
    if (strlen (format_ptr) > (unsigned) width)
      {
        conv_reason = CONV_ERR_DATE_OVERFLOW;
        return (NULL);
      }
    else
        return (format_ptr);
}

| << | < | > | >> iMatix Copyright © 1996-2000 iMatix Corporation