1 #include "os-dep.h"
2 #include "gcin.h"
3 #if UNIX
4 #include <dirent.h>
5 #include <X11/Xatom.h>
6 #else
7 #include <shellapi.h>
8 #include <shlobj.h>
9 #include <io.h>
10 #endif
11 
12 #if !CLIENT_LIB
13 #if WIN32
14 char *TableDir;
15 void init_gcin_program_files();
16 #else
17 char *TableDir=GCIN_TABLE_DIR;
18 #endif
19 
init_TableDir()20 void init_TableDir()
21 {
22   char *dname;
23   if ((dname=getenv("GCIN_TABLE_DIR"))) {
24     TableDir = dname;
25     return;
26   }
27 
28 #if WIN32
29   char tt[MAX_PATH];
30   init_gcin_program_files();
31 
32   sprintf_s(tt, sizeof(tt), "%s\\table", gcin_program_files_path);
33   TableDir=strdup(tt);
34   dbg("%s\n", TableDir);
35 #endif
36 }
37 
38 
get_gcin_dir(char * tt)39 void get_gcin_dir(char *tt)
40 {
41 #if WIN32
42   SHGetFolderPathA(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, tt);
43   strcat(tt,"\\gcin");
44 #else
45     strcpy(tt,(char *)getenv("HOME"));
46     strcat(tt,"/.gcin");
47 #endif
48 }
49 
50 
get_gcin_user_fname(char * name,char fname[])51 gboolean get_gcin_user_fname(char *name, char fname[])
52 {
53   get_gcin_dir(fname);
54 #if UNIX
55   strcat(strcat(fname,"/"),name);
56   return access(fname, R_OK)==0;
57 #else
58   strcat(strcat(fname,"\\"),name);
59   return (_access(fname, 04) >=0);
60 #endif
61 //  dbg("get_gcin_user_fname %s %s\n", name, fname);
62 }
63 
get_gcin_conf_fname(char * name,char fname[])64 void get_gcin_conf_fname(char *name, char fname[])
65 {
66   get_gcin_dir(fname);
67 #if UNIX
68   strcat(strcat(fname,"/config/"),name);
69 #else
70   strcat(strcat(fname,"\\config\\"),name);
71 #endif
72 }
73 
get_gcin_user_or_sys_fname(char * name,char fname[])74 void get_gcin_user_or_sys_fname(char *name, char fname[])
75 {
76   if (!getenv("GCIN_TABLE_DIR")) {
77     if (get_gcin_user_fname(name, fname))
78       return;
79   }
80 
81   get_sys_table_file_name(name, fname);
82 }
83 
get_gcin_conf_str(char * name,char ** rstr,char * default_str)84 void get_gcin_conf_str(char *name, char **rstr, char *default_str)
85 {
86   char fname[MAX_GCIN_STR];
87   char out[256];
88 
89   if (*rstr)
90     free(*rstr);
91 
92   get_gcin_conf_fname(name, fname);
93 
94   FILE *fp;
95 
96   if ((fp=fopen(fname, "rb")) == NULL) {
97     *rstr = strdup(default_str);
98     return;
99   }
100 
101   myfgets(out, sizeof(out), fp);
102   int len = strlen(out);
103   if (len && out[len-1]=='\n')
104     out[len-1] = 0;
105 
106   fclose(fp);
107 
108   *rstr = strdup(out);
109 }
110 
get_gcin_conf_fstr(char * name,char rstr[],char * default_str)111 void get_gcin_conf_fstr(char *name, char rstr[], char *default_str)
112 {
113   char *tt = NULL;
114   get_gcin_conf_str(name, &tt, default_str);
115   strcpy(rstr, tt);
116   free(tt);
117 }
118 
get_gcin_conf_int(char * name,int default_value)119 int get_gcin_conf_int(char *name, int default_value)
120 {
121   char tt[32];
122   char default_value_str[MAX_GCIN_STR];
123 
124   sprintf(default_value_str, "%d", default_value);
125   get_gcin_conf_fstr(name, tt, default_value_str);
126 
127   return atoi(tt);
128 }
129 
130 
save_gcin_conf_str(char * name,char * str)131 void save_gcin_conf_str(char *name, char *str)
132 {
133   FILE *fp;
134   char fname[256];
135 
136   get_gcin_conf_fname(name, fname);
137 
138   if ((fp=fopen(fname,"wb"))==NULL) {
139     p_err("cannot create %s", fname);
140   }
141 
142   fprintf(fp, "%s", str);
143   fclose(fp);
144 }
145 
146 
save_gcin_conf_int(char * name,int val)147 void save_gcin_conf_int(char *name, int val)
148 {
149   char tt[16];
150 
151   sprintf(tt, "%d", val);
152   save_gcin_conf_str(name, tt);
153 }
154 
get_sys_table_file_name(char * name,char * fname)155 void get_sys_table_file_name(char *name, char *fname)
156 {
157 #if UNIX
158   sprintf(fname, "%s/%s", TableDir, name);
159 #else
160   sprintf(fname, "%s\\%s", TableDir, name);
161 #endif
162 }
163 #endif
164 
165 #if UNIX
get_gcin_xim_name()166 char *get_gcin_xim_name()
167 {
168   char *xim_name;
169   static char sstr[32]="gcin";
170 
171   if ((xim_name=getenv("XMODIFIERS"))) {
172     static char find[] = "@im=";
173     char *p = strstr(xim_name, find);
174     if (!p)
175       return sstr;
176     p += strlen(find);
177     strncpy(sstr, p, sizeof(sstr));
178     sstr[sizeof(sstr) - 1]=0;
179 
180     if ((p=strchr(sstr, '.')))
181       *p=0;
182 
183 //    dbg("Try to use name from XMODIFIERS=@im=%s\n", sstr);
184   }
185 
186   return sstr;
187 }
188 
get_gcin_atom(Display * dpy)189 Atom get_gcin_atom(Display *dpy)
190 {
191   char *xim_name = get_gcin_xim_name();
192   char tt[128];
193 
194   snprintf(tt, sizeof(tt), "GCIN_ATOM_%s", xim_name);
195 
196   Atom atom = XInternAtom(dpy, tt, False);
197 
198   return atom;
199 }
200 #endif
201