/* rev_ctime.c (c)2002 Dave Von Pless (drdvp@freeshell.org) This file is placed in the public domain. Use as you see fit. Libray routine to perform the reverse of ctime(), i.e. convert ctime() formatted timestamp to a time_t. Usage: int rev_ctime(const char *ctime, time_t *timeptr); Input: 26-char string in ctime() format (Trailing '\n' will be handled, if present), pointer to a time_t. Return: 1 for success, 0 on failure. The correct time_t will be stored in the time_t pointer supplied. Compile with -DDEBUG to dump errors to stderr. These will be either a malloc() failure or bad token parsing. Compile with -DDEBUG=2 for parse info. EXAMPLE: ... time_t some_time; if((rev_ctime("Wed Dec 11 21:30:58 2002", &some_time)) { ... } ... */ #ifdef DEBUG #include /* for printf() */ #endif #include #include #include #define NUM_FIELDS 7 /* wday mon day hh:mm:ss yyyy */ int month2num(char *MonStr); /* Month text to int lookup */ /* Make a copy of the input string, as we'll clobber it in the parsing. Next, loop through the 7 fields, populating a struct tm with parsed data. Lastly, call mktime() to get the time_t */ int rev_ctime(const char *ctime, time_t *timeptr) { char *mystr, *p, *param; char sep=' '; /* ctime() string splits on space */ int field=0; struct tm tm; mystr=malloc(strlen(ctime)+1); if(!mystr) { #ifdef DEBUG fprintf(stderr,"rev_ctime(): malloc failure.\n"); #endif return 0; } strcpy(mystr,ctime); p=strchr(mystr,'\n'); /* Handle trailing newline, if present */ if(p) { *p='\0'; } param=mystr; while(field < NUM_FIELDS) { p=strchr(param,sep); if(!p) { /* We've failed */ #ifdef DEBUG fprintf(stderr,"rev_ctime(): Bad input @field %d\n\t" "-- can't find '%c' before %s in '%s'\n", field, sep,param, ctime); #endif free(mystr); return 0; } *p='\0'; p++; #if DEBUG==2 /* Show what we're parsing */ fprintf(stderr,"field=%d, param=%s, p=%s sep='%c'\n", field, param,p,sep); #endif switch(field) { case 0: break; /* We don't need tm_mday */ case 1: tm.tm_mon=month2num(param); if(tm.tm_mon > 12) { #ifdef DEBUG fprintf(stderr,"rev_ctime(): " "Bad month input -- " " %s\n", param); #endif free(mystr); return 0; } break; case 2: tm.tm_mday=atoi(param); sep=':'; /* Time splits on ':' */ break; case 3: tm.tm_hour=atoi(param); break; case 4: tm.tm_min=atoi(param); sep=' '; /* Split on ' ' */ break; case 5: tm.tm_sec=atoi(param); sep='\0'; /* Find string end */ break; case 6: tm.tm_year=(atoi(param)-1900); break; } param=p; field++; } tm.tm_isdst=-1; /* Have mktime() figure out DST */ *timeptr=mktime(&tm); free(mystr); return 1; } /* Return month number 0-11. Send 13 on error. */ int month2num(char *MonStr) { char *mons[]={ "Jan","Feb","Mar","Apr","May", "Jun","Jul","Aug", "Sep","Oct","Nov","Dec" }; int i; for(i=0;i<12;i++) { if(!strcmp(MonStr,mons[i])) { return i; } } return 13; /* Failed, impossible month! */ }