rfc_time.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2. Functions related to time:
  3. 1) rfc (string) time to unix-time
  4. 2) unix-time to rfc (string) time
  5. 3) current time to rfc (string) time for the "Date:" header
  6. */
  7. /****************************************************************
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2, or (at your option)
  11.  * any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  *
  22.  ****************************************************************/
  23. #include <linux/time.h>
  24. #include <linux/kernel.h>
  25. #include <linux/slab.h>
  26. #include <linux/ctype.h>
  27. #include "times.h"
  28. #include "prototypes.h"
  29. static char *dayName[7] = {
  30. "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
  31. };
  32. static char *monthName[12] = {
  33. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  34. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  35. };
  36. char CurrentTime[64];
  37. int  CurrentTime_i;
  38. static char itoa_h[60]={'0','0','0','0','0','0','0','0','0','0',
  39.  '1','1','1','1','1','1','1','1','1','1',
  40.  '2','2','2','2','2','2','2','2','2','2',
  41.  '3','3','3','3','3','3','3','3','3','3',
  42.  '4','4','4','4','4','4','4','4','4','4',
  43.  '5','5','5','5','5','5','5','5','5','5'};
  44. static char itoa_l[60]={'0','1','2','3','4','5','6','7','8','9',
  45.  '0','1','2','3','4','5','6','7','8','9',
  46.  '0','1','2','3','4','5','6','7','8','9',
  47.  '0','1','2','3','4','5','6','7','8','9',
  48.  '0','1','2','3','4','5','6','7','8','9',
  49.  '0','1','2','3','4','5','6','7','8','9'};
  50. void time_Unix2RFC(const time_t Zulu,char *Buffer)
  51. {
  52. int Y=0,M=0,D=0;
  53. int H=0,Min=0,S=0,WD=0;
  54. int I,I2;
  55. time_t rest;
  56. I=0;
  57. while (I<KHTTPD_NUMYEARS)
  58. {
  59. if (TimeDays[I][0]>Zulu) 
  60.    break;
  61. I++;
  62. }
  63. Y=--I;
  64. if (I<0) 
  65. {
  66. Y=0;
  67. goto BuildYear;
  68. }
  69. I2=0;
  70. while (I2<=12)
  71. {
  72. if (TimeDays[I][I2]>Zulu) 
  73.    break;
  74. I2++;
  75. }    
  76. M=I2-1;
  77. rest=Zulu - TimeDays[Y][M];
  78. WD=WeekDays[Y][M];
  79. D=rest/86400;
  80. rest=rest%86400;
  81. WD+=D;
  82. WD=WD%7;
  83. H=rest/3600;
  84. rest=rest%3600;
  85. Min=rest/60;
  86. rest=rest%60;
  87. S=rest;
  88. BuildYear:
  89. Y+=KHTTPD_YEAROFFSET;
  90. /* Format:  Day, 01 Mon 1999 01:01:01 GMT */
  91. /*
  92. We want to do 
  93. sprintf( Buffer, "%s, %02i %s %04i %02i:%02i:%02i GMT",
  94. dayName[ WD ], D+1, monthName[ M ], Y,
  95. H, Min, S
  96. );
  97. but this is very expensive. Since the string is fixed length,
  98. it is filled manually.
  99. */
  100. Buffer[0]=dayName[WD][0];
  101. Buffer[1]=dayName[WD][1];
  102. Buffer[2]=dayName[WD][2];
  103. Buffer[3]=',';
  104. Buffer[4]=' ';
  105. Buffer[5]=itoa_h[D+1];
  106. Buffer[6]=itoa_l[D+1];
  107. Buffer[7]=' ';
  108. Buffer[8]=monthName[M][0];
  109. Buffer[9]=monthName[M][1];
  110. Buffer[10]=monthName[M][2];
  111. Buffer[11]=' ';
  112. Buffer[12]=itoa_l[Y/1000];
  113. Buffer[13]=itoa_l[(Y/100)%10];
  114. Buffer[14]=itoa_l[(Y/10)%10];
  115. Buffer[15]=itoa_l[Y%10];
  116. Buffer[16]=' ';
  117. Buffer[17]=itoa_h[H];
  118. Buffer[18]=itoa_l[H];
  119. Buffer[19]=':';
  120. Buffer[20]=itoa_h[Min];
  121. Buffer[21]=itoa_l[Min];
  122. Buffer[22]=':';
  123. Buffer[23]=itoa_h[S];
  124. Buffer[24]=itoa_l[S];
  125. Buffer[25]=' ';
  126. Buffer[26]='G';
  127. Buffer[27]='M';
  128. Buffer[28]='T';
  129. Buffer[29]=0;
  130. }
  131. void UpdateCurrentDate(void)
  132. {
  133.    struct timeval tv;
  134.    
  135.    do_gettimeofday(&tv);
  136.    if (CurrentTime_i!=tv.tv_sec)
  137.    time_Unix2RFC(tv.tv_sec,CurrentTime);
  138.    
  139.    CurrentTime_i = tv.tv_sec;
  140. }
  141. static int MonthHash[32] = {0,0,7,0,0,0,0,0,0,0,0,3,0,0,0,2,6,0,5,0,9,8,4,0,0,11,1,10,0,0,0,0};
  142. #define is_digit(c) ((c) >= '0' && (c) <= '9')
  143. __inline static int skip_atoi(char **s)
  144. {
  145. int i=0;
  146. while (is_digit(**s))
  147. i = i*10 + *((*s)++) - '0';
  148. return i;
  149. }
  150. time_t mimeTime_to_UnixTime(char *Q)
  151. {
  152. int Y,M,D,H,Min,S;
  153. unsigned int Hash;
  154. time_t Temp;
  155. char *s,**s2;
  156. s=Q;
  157. s2=&s;
  158. if (strlen(s)<30) return 0;
  159. if (s[3]!=',') return 0;
  160. if (s[19]!=':') return 0;
  161. s+=5; /* Skip day of week */
  162. D = skip_atoi(s2);  /*  Day of month */
  163. s++;
  164. Hash = (unsigned char)s[0]+(unsigned char)s[2];
  165. Hash = (Hash<<1) + (unsigned char)s[1];
  166. Hash = (Hash&63)>>1;
  167. M = MonthHash[Hash];
  168. s+=4;
  169. Y = skip_atoi(s2); /* Year */
  170. s++;
  171. H = skip_atoi(s2); /* Hour */
  172. s++;
  173. Min = skip_atoi(s2); /* Minutes */
  174. s++;
  175. S = skip_atoi(s2); /* Seconds */
  176. s++;
  177. if ((s[0]!='G')||(s[1]!='M')||(s[2]!='T')) 
  178. {
  179.    return 0; /* No GMT */
  180.    }
  181. if (Y<KHTTPD_YEAROFFSET) Y = KHTTPD_YEAROFFSET;
  182. if (Y>KHTTPD_YEAROFFSET+9) Y = KHTTPD_YEAROFFSET+9;
  183. Temp =  TimeDays[Y-KHTTPD_YEAROFFSET][M];
  184. Temp += D*86400+H*3600+Min*60+S;
  185. return Temp;  
  186. }