/*===========================================================================* * * * sflcvds.c - * * * * Copyright (c) 1991-2003 iMatix Corporation * * * * ------------------ GPL Licensed Source Code ------------------ * * iMatix makes this software available under the GNU General * * Public License (GPL) license for open source projects. For * * details of the GPL license please see www.gnu.org or read the * * file license.gpl provided in this package. * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program in the file 'license.gpl'; if * * not, write to the Free Software Foundation, Inc., 59 Temple * * Place - Suite 330, Boston, MA 02111-1307, USA. * * * * You can also license this software under iMatix's General Terms * * of Business (GTB) for commercial projects. If you have not * * explicitly licensed this software under the iMatix GTB you may * * only use it under the terms of the GNU General Public License. * * * * For more information, send an email to info@imatix.com. * * -------------------------------------------------------------- * *===========================================================================*/ #include "prelude.h" /* Universal header file */ #include "sflconv.h" /* Prototypes for functions */ /* ---------------------------------------------------------------------[<]- Function: conv_date_str 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). ---------------------------------------------------------------------[>]-*/ char * conv_date_str ( long date, int flags, int format, int order, char datesep, int width) { 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); }