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

📄 cmpt.c

📁 wget (command line browser) source code
💻 C
📖 第 1 页 / 共 3 页
字号:
#define match_char(ch1, ch2) if (ch1 != ch2) return NULL#if defined __GNUC__ && __GNUC__ >= 2# define match_string(cs1, s2) \  ({ size_t len = strlen (cs1);						      \     int result = strncasecmp ((cs1), (s2), len) == 0;			      \     if (result) (s2) += len;						      \     result; })#else/* Oh come on.  Get a reasonable compiler.  */# define match_string(cs1, s2) \  (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))#endif/* We intentionally do not use isdigit() for testing because this will   lead to problems with the wide character version.  */#define get_number(from, to, n) \  do {									      \    int __n = n;							      \    val = 0;								      \    while (*rp == ' ')							      \      ++rp;								      \    if (*rp < '0' || *rp > '9')						      \      return NULL;							      \    do {								      \      val *= 10;							      \      val += *rp++ - '0';						      \    } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9');	      \    if (val < from || val > to)						      \      return NULL;							      \  } while (0)#ifdef _NL_CURRENT/* Added check for __GNUC__ extensions here for Wget. --abbotti */# if defined __GNUC__ && __GNUC__ >= 2#  define get_alt_number(from, to, n) \  ({									      \    __label__ do_normal;						      \    if (*decided != raw)						      \      {									      \	const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS);		      \	int __n = n;							      \	int any = 0;							      \	while (*rp == ' ')						      \	  ++rp;								      \	val = 0;							      \	do {								      \	  val *= 10;							      \	  while (*alts != '\0')						      \	    {								      \	      size_t len = strlen (alts);				      \	      if (strncasecmp (alts, rp, len) == 0)			      \	        break;							      \	      alts += len + 1;						      \	      ++val;							      \	    }								      \	  if (*alts == '\0')						      \	    {								      \	      if (*decided == not && ! any)				      \		goto do_normal;						      \	      /* If we haven't read anything it's an error.  */		      \	      if (! any)						      \		return NULL;						      \	      /* Correct the premature multiplication.  */		      \	      val /= 10;						      \	      break;							      \	    }								      \	  else								      \	    *decided = loc;						      \	} while (--__n > 0 && val * 10 <= to);				      \	if (val < from || val > to)					      \	  return NULL;							      \      }									      \    else								      \      {									      \       do_normal:							      \        get_number (from, to, n);					      \      }									      \    0;									      \  })# else#  define get_alt_number(from, to, n) \  do {    if (*decided != raw)						      \      {									      \	const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS);		      \	int __n = n;							      \	int any = 0;							      \	while (*rp == ' ')						      \	  ++rp;								      \	val = 0;							      \	do {								      \	  val *= 10;							      \	  while (*alts != '\0')						      \	    {								      \	      size_t len = strlen (alts);				      \	      if (strncasecmp (alts, rp, len) == 0)			      \	        break;							      \	      alts += len + 1;						      \	      ++val;							      \	    }								      \	  if (*alts == '\0')						      \	    {								      \	      if (*decided == not && ! any)				      \		goto do_normal;						      \	      /* If we haven't read anything it's an error.  */		      \	      if (! any)						      \		return NULL;						      \	      /* Correct the premature multiplication.  */		      \	      val /= 10;						      \	      break;							      \	    }								      \	  else								      \	    *decided = loc;						      \	} while (--__n > 0 && val * 10 <= to);				      \	if (val < from || val > to)					      \	  return NULL;							      \      }									      \    else								      \      {									      \       do_normal:							      \        get_number (from, to, n);					      \      }									      \  } while (0)# endif /* defined __GNUC__ && __GNUC__ >= 2 */#else# define get_alt_number(from, to, n) \  /* We don't have the alternate representation.  */			      \  get_number(from, to, n)#endif#define recursive(new_fmt) \  (*(new_fmt) != '\0'							      \   && (rp = strptime_internal (rp, (new_fmt), tm, decided)) != NULL)#ifdef _LIBC/* This is defined in locale/C-time.c in the GNU libc.  */extern const struct locale_data _nl_C_LC_TIME;extern const unsigned short int __mon_yday[2][13];# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)# define ab_weekday_name \  (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string)# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)# define HERE_T_FMT_AMPM \  (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n)#elsestatic char const weekday_name[][10] =  {    "Sunday", "Monday", "Tuesday", "Wednesday",    "Thursday", "Friday", "Saturday"  };static char const ab_weekday_name[][4] =  {    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"  };static char const month_name[][10] =  {    "January", "February", "March", "April", "May", "June",    "July", "August", "September", "October", "November", "December"  };static char const ab_month_name[][4] =  {    "Jan", "Feb", "Mar", "Apr", "May", "Jun",    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"  };# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"# define HERE_D_FMT "%m/%d/%y"# define HERE_AM_STR "AM"# define HERE_PM_STR "PM"# define HERE_T_FMT_AMPM "%I:%M:%S %p"# define HERE_T_FMT "%H:%M:%S"/* __mon_yday[][] is common to mktime and strptime implementations.   --abbotti */const unsigned short int __mon_yday[2][13];# ifndef NEED_MON_YDAY#  define NEED_MON_YDAY# endif#endif/* Status of lookup: do we use the locale data or the raw data?  */enum locale_status { not, loc, raw };#ifndef __isleap/* Nonzero if YEAR is a leap year (every 4 years,   except every 100th isn't, and every 400th is).  */# define __isleap(year)	\  ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))#endif/* Compute the day of the week.  */static voidday_of_the_week (struct tm *tm){  /* We know that January 1st 1970 was a Thursday (= 4).  Compute the     the difference between this data in the one on TM and so determine     the weekday.  */  int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2);  int wday = (-473	      + (365 * (tm->tm_year - 70))	      + (corr_year / 4)	      - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0)	      + (((corr_year / 4) / 25) / 4)	      + __mon_yday[0][tm->tm_mon]	      + tm->tm_mday - 1);  tm->tm_wday = ((wday % 7) + 7) % 7;}/* Compute the day of the year.  */static voidday_of_the_year (struct tm *tm){  tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon]		 + (tm->tm_mday - 1));}static char *#ifdef _LIBCinternal_function#endifstrptime_internal __P ((const char *buf, const char *format, struct tm *tm,			enum locale_status *decided));static char *#ifdef _LIBCinternal_function#endifstrptime_internal (rp, fmt, tm, decided)     const char *rp;     const char *fmt;     struct tm *tm;     enum locale_status *decided;{  const char *rp_backup;  int cnt;  size_t val;  int have_I, is_pm;  int century, want_century;  int have_wday, want_xday;  int have_yday;  int have_mon, have_mday;  have_I = is_pm = 0;  century = -1;  want_century = 0;  have_wday = want_xday = have_yday = have_mon = have_mday = 0;  while (*fmt != '\0')    {      /* A white space in the format string matches 0 more or white	 space in the input string.  */      if (ISSPACE (*fmt))	{	  while (ISSPACE (*rp))	    ++rp;	  ++fmt;	  continue;	}      /* Any character but `%' must be matched by the same character	 in the iput string.  */      if (*fmt != '%')	{	  match_char (*fmt++, *rp++);	  continue;	}      ++fmt;#ifndef _NL_CURRENT      /* We need this for handling the `E' modifier.  */    start_over:#endif      /* Make back up of current processing pointer.  */      rp_backup = rp;      switch (*fmt++)	{	case '%':	  /* Match the `%' character itself.  */	  match_char ('%', *rp++);	  break;	case 'a':	case 'A':	  /* Match day of week.  */	  for (cnt = 0; cnt < 7; ++cnt)	    {#ifdef _NL_CURRENT	      if (*decided !=raw)		{		  if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))		    {		      if (*decided == not			  && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),				     weekday_name[cnt]))			*decided = loc;		      break;		    }		  if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))		    {		      if (*decided == not			  && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),				     ab_weekday_name[cnt]))			*decided = loc;		      break;		    }		}#endif	      if (*decided != loc		  && (match_string (weekday_name[cnt], rp)		      || match_string (ab_weekday_name[cnt], rp)))		{		  *decided = raw;		  break;		}	    }	  if (cnt == 7)	    /* Does not match a weekday name.  */	    return NULL;	  tm->tm_wday = cnt;	  have_wday = 1;	  break;	case 'b':	case 'B':	case 'h':	  /* Match month name.  */	  for (cnt = 0; cnt < 12; ++cnt)	    {#ifdef _NL_CURRENT	      if (*decided !=raw)		{		  if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))		    {		      if (*decided == not			  && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),				     month_name[cnt]))			*decided = loc;		      break;		    }		  if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))		    {		      if (*decided == not			  && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),				     ab_month_name[cnt]))			*decided = loc;		      break;		    }		}#endif	      if (match_string (month_name[cnt], rp)		  || match_string (ab_month_name[cnt], rp))		{		  *decided = raw;		  break;		}	    }	  if (cnt == 12)	    /* Does not match a month name.  */	    return NULL;	  tm->tm_mon = cnt;	  want_xday = 1;	  break;	case 'c':	  /* Match locale's date and time format.  */#ifdef _NL_CURRENT	  if (*decided != raw)	    {	      if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))		{		  if (*decided == loc)		    return NULL;		  else		    rp = rp_backup;		}	      else		{		  if (*decided == not &&		      strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))		    *decided = loc;		  want_xday = 1;		  break;		}	      *decided = raw;	    }#endif	  if (!recursive (HERE_D_T_FMT))	    return NULL;	  want_xday = 1;	  break;	case 'C':	  /* Match century number.  */	  get_number (0, 99, 2);	  century = val;	  want_xday = 1;	  break;	case 'd':	case 'e':	  /* Match day of month.  */	  get_number (1, 31, 2);	  tm->tm_mday = val;	  have_mday = 1;	  want_xday = 1;	  break;	case 'F':	  if (!recursive ("%Y-%m-%d"))	    return NULL;	  want_xday = 1;	  break;	case 'x':#ifdef _NL_CURRENT	  if (*decided != raw)	    {	      if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))		{		  if (*decided == loc)		    return NULL;		  else		    rp = rp_backup;		}	      else		{		  if (*decided == not		      && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))		    *decided = loc;		  want_xday = 1;		  break;		}	      *decided = raw;	    }#endif	  /* Fall through.  */	case 'D':	  /* Match standard day format.  */	  if (!recursive (HERE_D_FMT))	    return NULL;	  want_xday = 1;	  break;	case 'k':	case 'H':	  /* Match hour in 24-hour clock.  */	  get_number (0, 23, 2);	  tm->tm_hour = val;	  have_I = 0;	  break;	case 'I':	  /* Match hour in 12-hour clock.  */	  get_number (1, 12, 2);	  tm->tm_hour = val % 12;	  have_I = 1;	  break;	case 'j':	  /* Match day number of year.  */	  get_number (1, 366, 3);	  tm->tm_yday = val - 1;	  have_yday = 1;	  break;	case 'm':	  /* Match number of month.  */	  get_number (1, 12, 2);	  tm->tm_mon = val - 1;	  have_mon = 1;	  want_xday = 1;	  break;	case 'M':	  /* Match minute.  */	  get_number (0, 59, 2);	  tm->tm_min = val;	  break;	case 'n':	case 't':	  /* Match any white space.  */	  while (ISSPACE (*rp))	    ++rp;	  break;	case 'p':	  /* Match locale's equivalent of AM/PM.  */#ifdef _NL_CURRENT	  if (*decided != raw)	    {	      if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))		{		  if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))		    *decided = loc;		  break;		}	      if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))		{		  if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))		    *decided = loc;		  is_pm = 1;		  break;		}	      *decided = raw;	    }#endif	  if (!match_string (HERE_AM_STR, rp))	    if (match_string (HERE_PM_STR, rp))	      is_pm = 1;	    else	      return NULL;	  break;	case 'r':#ifdef _NL_CURRENT	  if (*decided != raw)	    {	      if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))		{		  if (*decided == loc)		    return NULL;		  else		    rp = rp_backup;		}	      else		{		  if (*decided == not &&		      strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),			      HERE_T_FMT_AMPM))		    *decided = loc;		  break;		}	      *decided = raw;	    }#endif	  if (!recursive (HERE_T_FMT_AMPM))	    return NULL;	  break;	case 'R':	  if (!recursive ("%H:%M"))	    return NULL;	  break;	case 's':	  {	    /* The number of seconds may be very high so we cannot use	       the `get_number' macro.  Instead read the number	       character for character and construct the result while	       doing this.  */	    time_t secs = 0;	    if (*rp < '0' || *rp > '9')	      /* We need at least one digit.  */	      return NULL;	    do	      {

⌨️ 快捷键说明

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