⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parsdate.c

📁 国外网站上的一些精典的C程序
💻 C
字号:
/***  PARSDATE.C - A simple parser to extract dates from strings.****  Original Copyright 1995 by Robert B. Stout as part of**  the MicroFirm Function Library (MFL)****  The user is granted a free limited license to use this source file**  to create royalty-free programs, subject to the terms of the**  license restrictions specified in the LICENSE.MFL file.*/#include <stdlib.h>#include <string.h>#include <ctype.h>#include "datetime.h"static unsigned  year_norml(unsigned year);static Boolean_T get_fields(char *str);static Boolean_T validate(unsigned year, unsigned month, unsigned day);static Boolean_T isleap (unsigned yr);static unsigned  get_month(char *month);static char *fields[3];static char *month[2][12] = {      {"January", "February", "March", "April", "May", "June",       "July", "August", "September", "October", "November", "December"},      {"Jan", "Feb", "Mar", "Apr", "May", "Jun",       "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}};/***  parse_date() - Parse a date string into its components****  Arguments: 1 - String to parse**             2 - Address of year storage**             3 - Address of month storage**             4 - Address of day storage**             5 - Syntax to use****  Returns: 0 For success, non-zero for range errors****  Notes: The following syntaxes are supported:****    Date ordering: USA (month, day, year),**                   ISO (year, month, day)**                   EUROPE (day, month, year)**    Delimiters:    Spaces, commas, dashes, periods, slashes. (" ,-./")**    Years:         2-digit years assumed to be between 1970 and 2069**                   4-digit years required otherwise*/Boolean_T parse_date(const char *str,                     unsigned   *year,                     unsigned   *month,                     unsigned   *day,                     Syntax_T   syntax){      unsigned yy, mm, dd;                /* Local data                 */      char str_copy[512];                 /* Nice and roomy             */      strcpy(str_copy, str);      if (Error_ == get_fields(str_copy))            return Error_;      switch (syntax)      {      case USA:            yy = atoi(fields[2]);            dd = atoi(fields[1]);            if (isalpha(*fields[0]))            {                  mm = get_month(fields[0]);                  if (0 == mm)                  {                        return Error_;                  }            }            else  mm = atoi(fields[0]);            break;      case ISO:            yy = atoi(fields[0]);            dd = atoi(fields[2]);            if (isalpha(*fields[1]))            {                  mm = get_month(fields[1]);                  if (0 == mm)                        return Error_;            }            else  mm = atoi(fields[1]);            break;      case EUROPE:            yy = atoi(fields[2]);            dd = atoi(fields[0]);            if (isalpha(*fields[1]))            {                  mm = get_month(fields[1]);                  if (0 == mm)                        return Error_;            }            else  mm = atoi(fields[1]);            break;      default:            return Error_;      }      yy = year_norml(yy);      if (Error_ == validate(yy, mm, dd))            return Error_;      *year  = yy;      *day   = dd;      *month = mm;      return Success_;}/***  Utility function to split string fields*/static Boolean_T get_fields(char *str){      if (NULL == (fields[0] = strtok(str, " ,-./")))            return Error_;      if (NULL == (fields[1] = strtok(NULL, " ,-./")))            return Error_;      if (NULL == (fields[2] = strtok(NULL, " ,-./")))            return Error_;      if (NULL != strtok(NULL, " ,-./"))            return Error_;      return Success_;}/***  Utility function to validate dates*/static Boolean_T validate(unsigned year, unsigned month, unsigned day){      unsigned int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};      if (1 > month || 12 < month)            return Error_;      if (1 > day || day > (days[month - 1] + (2 == month && isleap(year))))            return Error_;      else  return Success_;}/***  Utility function to detect leap years*/static Boolean_T isleap (unsigned yr){   return yr % 400 == 0 || (yr % 4 == 0 && yr % 100 != 0);}/***  Utility function to normalize years*/static unsigned year_norml(unsigned year){      if (99 < year)            return year;      if (69 < year)            return year + 1900;      else  return year + 2000;}/***  Utility function to determine month from string****  (Note: Uses non-standard stricmp(), common to all DOS compilers*/static unsigned get_month(char *str){      int ix, iy;                         /* Indexes                    */      for (ix = 0; ix < 2; ++ix)      {            for (iy = 0; iy < 12; ++iy)            {                  if (Success_ == stricmp(str, month[ix][iy]))                        return iy + 1;            }      }      return 0;}#ifdef TEST#include <stdio.h>main(int argc, char *argv[]){      if (2 > argc)      {            puts("Usage: PARSDATE syntax date_string");            puts("       syntax = 0, 1, or 2");            return EXIT_FAILURE;      }      while (--argc)      {            Syntax_T syntax;            char *str;            unsigned yy, mm, dd;            Boolean_T retval;            if (4 > argc)                  break;            syntax = atoi(*++argv);            str = *++argv;            printf("str = \"%s\"\n", str);            retval = parse_date(str, &yy, &mm, &dd, syntax);            printf("parse_date(%d, \"%s\") returned %d\n"                  "  date = %u-%u-%u\n\n",                  syntax, str, retval, mm, dd, yy);      }      return EXIT_SUCCESS;}#endif /* TEST */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -