]> www.wagner.pp.ru Git - oss/catdoc.git/blob - src/confutil.c
Added all the history to NEWS file
[oss/catdoc.git] / src / confutil.c
1 /*
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.
6 */
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10 #include <unistd.h>
11 #include <ctype.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #ifdef HAVE_LANGINFO
15 #include <langinfo.h>
16 #ifndef __TURBOC__
17 #include <locale.h>
18 #endif
19 #endif
20 #include "catdoc.h"
21
22 char *format_name="ascii";
23 static int runtime_locale_check=1;
24 /********************************************************************/
25 /*  Reads configuration file                                        */
26 /*                                                                  */
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;
31         int lineno=0;
32         if (!f) return;
33         while (!feof(f)) {
34                 fgets(line,1024,f);
35                 if (feof(f)) break;
36                 lineno++;
37                 if ((c=strchr(line,'#'))) *c='\0';
38                 name=line;
39                 while (*name&&isspace(*name)) name++;
40                 if (!*name) continue;
41                 for (value=name;*value&&(isalnum(*value)||*value=='_'); value++);  
42                 if (*value=='=') {
43                         *value=0;value++;
44                 } else {
45                         *value=0;value++;
46                         while(*value&&isspace(*value)) value++;
47                         if (*value++ != '=' ) {
48                                 fprintf(stderr,"Error %s(%d): name = value syntax expected\n",
49                                                 filename,lineno);
50                                 exit(1);
51                         }
52                         while(*value&&isspace(*value)) value++;
53                 }
54                 for (c=value;*c&&!isspace(*c);c++);
55                 if (value==c) {
56                         fprintf(stderr,"Error %s(%d): name = value syntax expected\n",
57                                         filename,lineno);
58                         exit(1);
59                 }
60                 *c=0;
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++;        
74                         bad_char[0] = *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;
80                         } else {
81                                 fprintf(stderr,"Error %s(%d): use_locale requires 'yes' or 'no'\n",
82                                                 filename,lineno);
83                                 exit(1);
84                         }       
85
86                 } else {
87                         fprintf(stderr,"Invalid configuration directive in %s(%d):,%s = %s\n",
88                                         filename,lineno,name,value);            
89                         exit(1);
90                 }       
91         }
92         fclose(f);
93 }
94 #ifdef HAVE_LANGINFO
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() {
101         char *codeset;
102         if (!runtime_locale_check) return;
103 #ifndef __TURBOC__      
104         if (!setlocale(LC_CTYPE,"")) return;
105 #endif
106         codeset = nl_langinfo(CODESET);
107         if (!strncmp(codeset,"ISO",3)||!strncmp(codeset,"iso",3)) {
108                 codeset+=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") ;
113                 }       else {   
114                         if (check_charset(&dest_csname,codeset)) {
115                                 locale_charset = dest_csname;
116                         }
117                 }
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)) {
121                 char *newstr;
122                 if (*codeset=='-') {
123                         codeset++;
124                 }       
125                 newstr  = malloc(strlen(codeset)-4+2+1);
126                 strcpy(newstr,"cp");
127                 strcpy(newstr+2,codeset+4);
128                 if (check_charset(&dest_csname,newstr)) {
129                         locale_charset = dest_csname;
130                 }
131                 free(newstr);
132         } else if (!strncmp(codeset,"IBM",3)) {
133                 char *newstr;
134                 codeset+=3;
135                 if (*codeset == '-') codeset++;
136                 newstr=malloc(strlen(codeset)+2+1);
137                 strcpy(newstr,"cp");
138                 strcpy(newstr+2,codeset);
139                 if (check_charset(&dest_csname, newstr)) {
140                         locale_charset=dest_csname;
141                 }
142                 free(newstr);
143         } else {
144                 char *i,*newstr = strdup(codeset);
145                 for (i=newstr;*i;i++) {
146                         *i=tolower(*i);
147                 }       
148                 if (check_charset(&dest_csname,newstr)) {
149                         locale_charset = dest_csname;
150                 }       
151         }       
152
153 }       
154 #ifndef __TURBOC__
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,"");          
160 }       
161 #endif
162 #endif
163 #ifndef HAVE_STRDUP
164 /* Implementation of strdup for systems which don't have it */
165 char *strdup(const char *s) {
166         int size=strlen(s);
167         char *newstr;
168         newstr=malloc(size+1);
169         return strcpy(newstr,s);
170 }       
171 #endif