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