2 Copyright 1998-2003 Victor Wagner
3 Copyright 2003 Alex Ott
4 This file is released under the GPL. Details can be
5 found in the file COPYING accompanying this distribution.
22 char *format_name="ascii";
23 static int runtime_locale_check=1;
24 /********************************************************************/
25 /* Reads configuration file */
27 /********************************************************************/
28 void read_config_file(const char* filename) {
29 FILE *f=fopen(add_exe_path(filename),"rb");
30 char *name,*value,line[1024],*c;
37 if ((c=strchr(line,'#'))) *c='\0';
39 while (*name&&isspace(*name)) name++;
41 for (value=name;*value&&(isalnum(*value)||*value=='_'); value++);
46 while(*value&&isspace(*value)) value++;
47 if (*value++ != '=' ) {
48 fprintf(stderr,"Error %s(%d): name = value syntax expected\n",
52 while(*value&&isspace(*value)) value++;
54 for (c=value;*c&&!isspace(*c);c++);
56 fprintf(stderr,"Error %s(%d): name = value syntax expected\n",
61 if (!strcmp(name,"source_charset")) {
62 source_csname=strdup(value);
63 } else if (!strcmp(name,"target_charset")) {
64 dest_csname=strdup(value);
65 } else if (!strcmp(name,"format")) {
66 format_name=strdup(value);
67 } else if (!strcmp(name,"charset_path")) {
68 charset_path=strdup(value);
69 } else if (!strcmp(name,"map_path")) {
70 map_path = strdup(value);
71 } else if (!strcmp(name,"unknown_char")) {
72 if (*value=='"' && value[1] && value[2]=='"') value++;
73 if (*value=='\'' && value[1] && value[2]=='\'') value++;
75 } else if (!strcmp(name,"use_locale")) {
76 if (tolower(value[0])=='n') {
77 runtime_locale_check=0;
78 } else if (tolower(value[0])=='y') {
79 runtime_locale_check=1;
81 fprintf(stderr,"Error %s(%d): use_locale requires 'yes' or 'no'\n",
87 fprintf(stderr,"Invalid configuration directive in %s(%d):,%s = %s\n",
88 filename,lineno,name,value);
95 static char *locale_charset = NULL;
96 /*********************************************************************/
97 /* Determines output character set from current locale and puts it *
98 * into global variable dest_csname *
99 *********************************************************************/
100 void get_locale_charset() {
102 if (!runtime_locale_check) return;
104 if (!setlocale(LC_CTYPE,"")) return;
106 codeset = nl_langinfo(CODESET);
107 if (!strncmp(codeset,"ISO",3)||!strncmp(codeset,"iso",3)) {
109 if (*codeset=='-') codeset++;
110 if (!strncmp(codeset,"646",3)) {
111 /* ISO 646 is another name for us=ascii */
112 check_charset(&dest_csname,"us-ascii") ;
114 if (check_charset(&dest_csname,codeset)) {
115 locale_charset = dest_csname;
118 } else if (!strcmp(codeset,"ANSI_X3.4-1968")) {
119 check_charset(&dest_csname,"us-ascii");
120 } else if (!strncmp(codeset,"ANSI",4)||!strncmp(codeset,"ansi",4)) {
125 newstr = malloc(strlen(codeset)-4+2+1);
127 strcpy(newstr+2,codeset+4);
128 if (check_charset(&dest_csname,newstr)) {
129 locale_charset = dest_csname;
132 } else if (!strncmp(codeset,"IBM",3)) {
135 if (*codeset == '-') codeset++;
136 newstr=malloc(strlen(codeset)+2+1);
138 strcpy(newstr+2,codeset);
139 if (check_charset(&dest_csname, newstr)) {
140 locale_charset=dest_csname;
144 char *i,*newstr = strdup(codeset);
145 for (i=newstr;*i;i++) {
148 if (check_charset(&dest_csname,newstr)) {
149 locale_charset = dest_csname;
155 void set_time_locale() {
156 if (!runtime_locale_check) return;
157 if (!locale_charset) return;
158 if (strcmp(locale_charset,dest_csname)!=0) return;
159 setlocale(LC_TIME,"");
164 /* Implementation of strdup for systems which don't have it */
165 char *strdup(const char *s) {
168 newstr=malloc(size+1);
169 return strcpy(newstr,s);