char *tz_locale(char *country, char *province, char *city) { extern char *tz_name(char *tzspec); static char tzname[256]=""; char filepath[1024]; FILE *fp = NULL; char buffer[1024]; char target[256]; int len = sprintf(target,"%s/%s/%s",country,province,city); if(find_file(TZFILE, NULL, R_OK,filepath,sizeof(filepath)) == NULL){ THROW("timezone specification file %s not found in GLPATH=%s: %s", TZFILE, getenv("GLPATH"), strerror(errno)); /* TROUBLESHOOT The system could not locate the timezone file <code>tzinfo.txt</code>. Check that the <code>etc</code> folder is included in the '''GLPATH''' environment variable and try again. */ } fp = fopen(filepath,"r"); if(fp == NULL){ THROW("%s: access denied: %s", filepath, strerror(errno)); /* TROUBLESHOOT The system was unable to read the timezone file. Check that the file has the correct permissions and try again. */ } while( fgets(buffer,sizeof(buffer),fp)!=NULL ) { char *locale = buffer; if ( locale[0]==';' || locale[0]=='\0' ) continue; if ( iswspace(locale[0]) ) { while ( iswspace(locale[0]) && locale[0]!='\0' ) locale++; /* trim left white */ if ( strnicmp(locale,target,len)==0 ) { fclose(fp); return tz_name(tzname); } } else sscanf(buffer, "%[^,]", tzname); } THROW("tz_locale(char *country='%s', char *province='%s', char *city='%s'): not tzinfo entry found", country, province, city); return NULL; }
static atom_t tz_name_as_atom(int dst) { static atom_t a[2]; dst = (dst > 0); /* 0 or 1 */ if ( !a[dst] ) { wchar_t wbuf[256]; const char *str = tz_name(dst); size_t n; if ( (n = mbstowcs(wbuf, str, sizeof(wbuf)/sizeof(wbuf[0])-1)) != (size_t)-1 ) { a[dst] = PL_new_atom_wchars(n, wbuf); } else { a[dst] = PL_new_atom(str); } } return a[dst]; }
/** Load a timezone from the timezone info file **/ void load_tzspecs(char *tz){ char filepath[1024]; char *pTzname = 0; FILE *fp = NULL; char buffer[1024]; int linenum = 0; int year = YEAR0; int y; int found; found = 0; tzvalid = 0; pTzname = tz_name(tz); if(pTzname == 0){ THROW("timezone '%s' was not understood by tz_name.", tz); /* TROUBLESHOOT The specific timezone is not valid. Try using a valid timezone or add the desired timezone to the timezone file <code>.../etc/tzinfo.txt</code> and try again. */ } strncpy(current_tzname, pTzname, sizeof(current_tzname)); tzoffset = tz_offset(current_tzname); strncpy(tzstd, tz_std(current_tzname), sizeof(tzstd)); strncpy(tzdst, tz_dst(current_tzname), sizeof(tzdst)); if(find_file(TZFILE, NULL, R_OK,filepath,sizeof(filepath)) == NULL){ THROW("timezone specification file %s not found in GLPATH=%s: %s", TZFILE, getenv("GLPATH"), strerror(errno)); /* TROUBLESHOOT The system could not locate the timezone file <code>tzinfo.txt</code>. Check that the <code>etc</code> folder is included in the '''GLPATH''' environment variable and try again. */ } fp = fopen(filepath,"r"); if(fp == NULL){ THROW("%s: access denied: %s", filepath, strerror(errno)); /* TROUBLESHOOT The system was unable to read the timezone file. Check that the file has the correct permissions and try again. */ } // zero previous DST start/end times for (y = 0; y < sizeof(tszero) / sizeof(tszero[0]); y++){ dststart[y] = dstend[y] = -1; } while(fgets(buffer,sizeof(buffer),fp)){ char *p = NULL; char tzname[32]; SPEC start, end; int form = -1; linenum++; /* wipe comments */ p = strchr(buffer,';'); if(p != NULL){ *p = '\0'; } /* remove trailing whitespace */ p = buffer + strlen(buffer) - 1; while (iswspace(*p) && p > buffer){ *p-- = '\0'; } /* ignore blank lines or lines starting with white space*/ if (buffer[0] == '\0' || iswspace(buffer[0])){ continue; } /* year section */ if(sscanf(buffer, "[%d]", &year) == 1){ continue; } /* TZ spec */ form = sscanf(buffer, "%[^,],M%d.%d.%d/%d:%d,M%d.%d.%d/%d:%d", tzname, &start.month, &start.nth, &start.day, &start.hour, &start.minute, &end.month, &end.nth, &end.day, &end.hour, &end.minute); /* load only TZ requested */ pTzname = tz_name(tzname); if (tz != NULL && pTzname != NULL && strcmp(pTzname,current_tzname) != 0){ continue; } if(form == 1){ /* no DST */ set_tzspec(year, current_tzname, NULL, NULL); found = 1; } else if(form == 11) { /* full DST spec */ set_tzspec(year, current_tzname, &start, &end); found = 1; } else { THROW("%s(%d): %s is not a valid timezone spec", filepath, linenum, buffer); /* TROUBLESHOOT The timezone specification is not valid. Verify the syntax of the timezone spec and that it is defined in the timezone file <code>.../etc/tzinfo.txt</code> or add it, and try again. */ } } if(found == 0){ output_warning("%s(%d): timezone spec '%s' not found in 'tzinfo.txt', will include no DST information", filepath, linenum, current_tzname); } if(ferror(fp)){ output_error("%s(%d): %s", filepath, linenum, strerror(errno)); } else { output_verbose("%s loaded ok", filepath); } fclose(fp); tzvalid = 1; }
static int custom_get_tzname(char *s, size_t max) { return copy(s, max, tz_name()); }