|
|
1.1 ! root 1: #include <time.h> ! 2: #include <libc.h> ! 3: #include <sys/types.h> ! 4: #include <sys/timeb.h> ! 5: #include <ctype.h> ! 6: ! 7: static ! 8: reduce(fp,n) ! 9: int *fp; ! 10: { ! 11: int val = 0; ! 12: for( ; *fp<0; *fp+=n) ! 13: val--; ! 14: val += *fp/n; ! 15: *fp %= n; ! 16: return val; ! 17: } ! 18: ! 19: static char Month[][3] = {"jan","feb","mar","apr","may","jun", ! 20: "jul","aug","sep","oct","nov","dec","\0"}; ! 21: static char Zone[][3] = {"gmt","est","edt","cst","cdt", ! 22: "mst","mdt","pst","pdt","\0"}; ! 23: static int Diff[] = {0,5*60,4*60,6*60,5*60,7*60,6*60,8*60,7*60}; ! 24: static int mday[] = {0,31,59,90,120,151,181,212,243,273,304,334}; ! 25: ! 26: long timegm(tp) ! 27: struct tm *tp; ! 28: { ! 29: int n; ! 30: struct tm tm; ! 31: tm = *tp; ! 32: tm.tm_year += reduce(&tm.tm_mon, 12); ! 33: tm.tm_yday += mday[tm.tm_mon] + tm.tm_mday ! 34: - ((tm.tm_year%4!=0)|(tm.tm_mon<3)); ! 35: tm.tm_min += reduce(&tm.tm_sec, 60); ! 36: tm.tm_hour += reduce(&tm.tm_min, 60); ! 37: tm.tm_yday += reduce(&tm.tm_hour, 24); ! 38: tm.tm_year += 4*reduce(&tm.tm_yday, 4*365+1); ! 39: while(tm.tm_yday >= (n = 365+((tm.tm_year%4)==0))) ! 40: tm.tm_yday -= n, tm.tm_year++; ! 41: return tm.tm_sec + 60*(tm.tm_min + ! 42: 60*(tm.tm_hour + 24L*(tm.tm_yday + ! 43: 365*(tm.tm_year-70) + (tm.tm_year-69)/4))); ! 44: } ! 45: ! 46: long timelocal(tp,zone) ! 47: struct tm *tp; ! 48: char *zone; ! 49: { ! 50: struct timeb systime; ! 51: long date; ! 52: date = timegm(tp); ! 53: if(zone==0) { ! 54: ftime(&systime); ! 55: date += systime.timezone*60L; ! 56: if(systime.dstflag && ! 57: localtime(&date)->tm_isdst) ! 58: date -= 3600; ! 59: } else ! 60: date += Diff[serialno(zone,Zone)]; ! 61: return date; ! 62: } ! 63: ! 64: static char *breaks = "\t ,:\n"; ! 65: ! 66: static char * ! 67: skipfld(s) ! 68: char *s; ! 69: { ! 70: char *t = strpbrk(s,breaks); ! 71: return t!=0? t: s+strlen(s); ! 72: } ! 73: ! 74: static char* ! 75: skipbrk(s) ! 76: char *s; ! 77: { ! 78: return s + strspn(s,breaks); ! 79: } ! 80: ! 81: long ! 82: timec(s) ! 83: char *s; ! 84: { ! 85: char *t; ! 86: struct tm tm; ! 87: char *zone = 0; ! 88: tm.tm_sec = tm.tm_min = tm.tm_hour = 0; ! 89: tm.tm_mon = tm.tm_mday = tm.tm_yday = 0; ! 90: for(s=skipbrk(s); isalpha(*s); s=skipbrk(skipfld(s))) ! 91: tm.tm_mon = serialno(s,Month); ! 92: tm.tm_mday = atoi(s); ! 93: s = skipbrk(skipfld(s)); ! 94: t = skipfld(s); ! 95: if(*t==':') { ! 96: tm.tm_hour = atoi(s); ! 97: tm.tm_min = atoi(++t); ! 98: t = skipfld(t); ! 99: if(*t==':') { ! 100: tm.tm_sec = atoi(++t); ! 101: t = skipfld(t); ! 102: } ! 103: s = skipbrk(t); ! 104: } ! 105: tm.tm_year = atoi(s); ! 106: if(tm.tm_year!=0) ! 107: s = skipbrk(skipfld(s)); ! 108: if(isalpha(*s)) { ! 109: zone = s; ! 110: s = skipbrk(skipfld(s)); ! 111: } ! 112: if(tm.tm_year==0) ! 113: tm.tm_year = atoi(s); ! 114: tm.tm_year -= 1900; ! 115: if(tm.tm_year < 0) { ! 116: long clock; ! 117: time(&clock); ! 118: tm.tm_year = localtime(&clock)->tm_year; ! 119: if(timelocal(&tm,zone) > clock) ! 120: tm.tm_year--; ! 121: } ! 122: return timelocal(&tm,zone); ! 123: } ! 124: ! 125: static ! 126: serialno(item,list) ! 127: char *item, list[][3]; ! 128: { ! 129: register i,j; ! 130: for(i=0; list[i][0]; i++) ! 131: for(j=0; j<3; j++) ! 132: if(tolower(item[j])!=list[i][j]) ! 133: break; ! 134: else if(j==2) ! 135: return i; ! 136: return 0; ! 137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.