Commit ee8c50e3968a14ca2979ef110f319b8e5d5be9c1
1 parent
091ee6b8
Exists in
master
and in
3 other branches
Refactoring filename builders.
Showing
5 changed files
with
158 additions
and
21 deletions
Show diff stats
Makefile.in
src/core/linux/util.c
... | ... | @@ -34,14 +34,59 @@ |
34 | 34 | |
35 | 35 | |
36 | 36 | #include <config.h> |
37 | +#include <stdarg.h> | |
37 | 38 | #include <lib3270-internals.h> |
38 | 39 | |
39 | -char * lib3270_build_data_filename(const char *name) | |
40 | +static char * build_filename(const char *root, const char *str, va_list args) | |
40 | 41 | { |
41 | - return lib3270_strdup_printf(LIB3270_STRINGIZE_VALUE_OF(DATADIR) "/%s",name); | |
42 | + size_t szFilename = 1024 + strlen(root); | |
43 | + char * filename = (char *) lib3270_malloc(szFilename); | |
44 | + | |
45 | + strcpy(filename,root); | |
46 | + | |
47 | + while(str) { | |
48 | + | |
49 | + size_t szCurrent = strlen(filename); | |
50 | + | |
51 | + if(filename[szCurrent-1] != '/') | |
52 | + strcat(filename,"/"); | |
53 | + | |
54 | + szCurrent += strlen(str); | |
55 | + | |
56 | + if(szCurrent >= szFilename) | |
57 | + { | |
58 | + szFilename += (szCurrent + 1024); | |
59 | + filename = lib3270_realloc(filename,szFilename); | |
60 | + } | |
61 | + | |
62 | + strcat(filename,str); | |
63 | + | |
64 | + str = va_arg(args, const char *); | |
65 | + } | |
66 | + | |
67 | + return (char *) lib3270_realloc(filename,strlen(filename)+1); | |
42 | 68 | } |
43 | 69 | |
44 | -char * lib3270_build_config_filename(const char *name) | |
70 | +char * lib3270_build_data_filename(const char *str, ...) | |
45 | 71 | { |
46 | - return lib3270_strdup_printf(LIB3270_STRINGIZE_VALUE_OF(CONFDIR) "/%s",name); | |
72 | + va_list args; | |
73 | + va_start (args, str); | |
74 | + | |
75 | + char *filename = build_filename(LIB3270_STRINGIZE_VALUE_OF(DATADIR), str, args); | |
76 | + | |
77 | + va_end (args); | |
78 | + | |
79 | + return filename; | |
80 | +} | |
81 | + | |
82 | +char * lib3270_build_config_filename(const char *str, ...) | |
83 | +{ | |
84 | + va_list args; | |
85 | + va_start (args, str); | |
86 | + | |
87 | + char *filename = build_filename(LIB3270_STRINGIZE_VALUE_OF(CONFDIR), str, args); | |
88 | + | |
89 | + va_end (args); | |
90 | + | |
91 | + return filename; | |
47 | 92 | } | ... | ... |
src/core/windows/util.c
... | ... | @@ -249,6 +249,34 @@ int gettimeofday(struct timeval *tv, void GNUC_UNUSED(*ignored)) |
249 | 249 | return 0; |
250 | 250 | } |
251 | 251 | |
252 | +LIB3270_EXPORT char * lib3270_get_installation_path() | |
253 | +{ | |
254 | + char lpFilename[4096]; | |
255 | + | |
256 | + memset(lpFilename,0,sizeof(lpFilename)); | |
257 | + DWORD szPath = GetModuleFileName(hModule,lpFilename,sizeof(lpFilename)); | |
258 | + lpFilename[szPath] = 0; | |
259 | + | |
260 | + char * ptr = strrchr(lpFilename,'\\'); | |
261 | + if(ptr) | |
262 | + ptr[1] = 0; | |
263 | + | |
264 | + return strdup(lpFilename); | |
265 | +} | |
266 | + | |
267 | +char * lib3270_get_user_name() | |
268 | +{ | |
269 | + char username[UNLEN + 1]; | |
270 | + DWORD szName = UNLEN; | |
271 | + | |
272 | + memset(username,0,UNLEN + 1); | |
273 | + GetUserName(username, &szName); | |
274 | + | |
275 | + return strdup(username); | |
276 | + | |
277 | +} | |
278 | + | |
279 | +/* | |
252 | 280 | LIB3270_EXPORT char * lib3270_build_data_filename(const char *name) |
253 | 281 | { |
254 | 282 | // https://github.com/GNOME/glib/blob/master/glib/gwin32.c |
... | ... | @@ -274,31 +302,77 @@ char * lib3270_build_config_filename(const char *name) |
274 | 302 | // On windows the data and config path are the same. |
275 | 303 | return lib3270_build_data_filename(name); |
276 | 304 | } |
305 | +*/ | |
277 | 306 | |
278 | -LIB3270_EXPORT char * lib3270_get_installation_path() | |
307 | +static char * build_filename(const char *str, va_list args) | |
279 | 308 | { |
280 | - char lpFilename[4096]; | |
309 | + size_t szFilename = MAX_PATH; | |
310 | + char *ptr; | |
311 | + char * filename = (char *) lib3270_malloc(szFilename); | |
281 | 312 | |
282 | - memset(lpFilename,0,sizeof(lpFilename)); | |
283 | - DWORD szPath = GetModuleFileName(hModule,lpFilename,sizeof(lpFilename)); | |
284 | - lpFilename[szPath] = 0; | |
313 | + memset(filename,0,szFilename); | |
285 | 314 | |
286 | - char * ptr = strrchr(lpFilename,'\\'); | |
315 | +#ifdef DEBUG | |
316 | + filename[0] = '.'; | |
317 | +#else | |
318 | + DWORD szPath = GetModuleFileName(hModule,filename,szFilename); | |
319 | + filename[szPath] = 0; | |
320 | +#endif // DEBUG | |
321 | + | |
322 | + ptr = strrchr(filename,'\\'); | |
287 | 323 | if(ptr) |
288 | 324 | ptr[1] = 0; |
289 | 325 | |
290 | - return strdup(lpFilename); | |
326 | + while(str) { | |
327 | + | |
328 | + size_t szCurrent = strlen(filename); | |
329 | + | |
330 | + for(ptr=filename;*ptr;ptr++) | |
331 | + { | |
332 | + if(*ptr == '/') | |
333 | + *ptr = '\\'; | |
334 | + } | |
335 | + | |
336 | + if(filename[szCurrent-1] != '\\') | |
337 | + strcat(filename,"\\"); | |
338 | + | |
339 | + szCurrent += strlen(str); | |
340 | + | |
341 | + if(szCurrent >= szFilename) | |
342 | + { | |
343 | + szFilename += (szCurrent + 1024); | |
344 | + filename = lib3270_realloc(filename,szFilename); | |
345 | + } | |
346 | + | |
347 | + strcat(filename,str); | |
348 | + | |
349 | + str = va_arg(args, const char *); | |
350 | + } | |
351 | + | |
352 | + return (char *) lib3270_realloc(filename,strlen(filename)+1); | |
291 | 353 | } |
292 | 354 | |
293 | -char * lib3270_get_user_name() | |
355 | +char * lib3270_build_data_filename(const char *str, ...) | |
294 | 356 | { |
295 | - char username[UNLEN + 1]; | |
296 | - DWORD szName = UNLEN; | |
357 | + va_list args; | |
358 | + va_start (args, str); | |
297 | 359 | |
298 | - memset(username,0,UNLEN + 1); | |
299 | - GetUserName(username, &szName); | |
360 | + char *filename = build_filename(str, args); | |
300 | 361 | |
301 | - return strdup(username); | |
362 | + va_end (args); | |
363 | + | |
364 | + return filename; | |
365 | +} | |
366 | + | |
367 | +char * lib3270_build_config_filename(const char *str, ...) | |
368 | +{ | |
369 | + va_list args; | |
370 | + va_start (args, str); | |
371 | + | |
372 | + char *filename = build_filename(str, args); | |
373 | + | |
374 | + va_end (args); | |
302 | 375 | |
376 | + return filename; | |
303 | 377 | } |
304 | 378 | ... | ... |
src/include/lib3270.h
... | ... | @@ -51,18 +51,22 @@ |
51 | 51 | |
52 | 52 | #define LIB3270_GNUC_FORMAT(s,f) __attribute__ ((__format__ (__printf__, s, f))) |
53 | 53 | #define LIB3270_DEPRECATED(func) func __attribute__ ((deprecated)) |
54 | + #define LIB3270_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) | |
54 | 55 | |
55 | 56 | #elif defined(_WIN32) |
56 | 57 | |
57 | 58 | #define LIB3270_DEPRECATED(func) __declspec(deprecated) func |
59 | + #define LIB3270_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) | |
58 | 60 | |
59 | 61 | #elif defined(__LCLINT__) |
60 | 62 | |
61 | 63 | #define LIB3270_DEPRECATED(func) func |
64 | + #define LIB3270_GNUC_NULL_TERMINATED | |
62 | 65 | |
63 | 66 | #else |
64 | 67 | |
65 | 68 | #define LIB3270_DEPRECATED(func) func |
69 | + #define LIB3270_GNUC_NULL_TERMINATED | |
66 | 70 | |
67 | 71 | #endif |
68 | 72 | |
... | ... | @@ -1484,9 +1488,9 @@ |
1484 | 1488 | * @return Full path for the file (release it with lib3270_free). |
1485 | 1489 | * |
1486 | 1490 | */ |
1487 | - LIB3270_EXPORT char * lib3270_build_data_filename(const char *name); | |
1491 | + LIB3270_EXPORT char * lib3270_build_data_filename(const char *str, ...) LIB3270_GNUC_NULL_TERMINATED; | |
1488 | 1492 | |
1489 | - LIB3270_EXPORT char * lib3270_build_config_filename(const char *name); | |
1493 | + LIB3270_EXPORT char * lib3270_build_config_filename(const char *str, ...) LIB3270_GNUC_NULL_TERMINATED; | |
1490 | 1494 | |
1491 | 1495 | LIB3270_EXPORT void lib3270_set_session_id(H3270 *hSession, char id); |
1492 | 1496 | LIB3270_EXPORT char lib3270_get_session_id(H3270 *hSession); | ... | ... |
src/testprogram/testprogram.c
... | ... | @@ -38,10 +38,9 @@ int main(int argc, char *argv[]) |
38 | 38 | }; |
39 | 39 | // #pragma GCC diagnostic pop |
40 | 40 | |
41 | - H3270 * h; | |
41 | + H3270 * h = lib3270_session_new(""); | |
42 | 42 | int rc = 0; |
43 | 43 | |
44 | - h = lib3270_session_new(""); | |
45 | 44 | printf("3270 session %p created\n]",h); |
46 | 45 | |
47 | 46 | lib3270_set_url(h,NULL); |
... | ... | @@ -75,6 +74,17 @@ int main(int argc, char *argv[]) |
75 | 74 | } |
76 | 75 | #endif // _WIN32 |
77 | 76 | |
77 | + { | |
78 | + lib3270_autoptr(char) datafile = lib3270_build_data_filename("data","file.txt",NULL); | |
79 | + printf("Datafile: \"%s\"\n",datafile); | |
80 | + } | |
81 | + | |
82 | + { | |
83 | + lib3270_autoptr(char) datafile = lib3270_build_config_filename("test","file.conf",NULL); | |
84 | + printf("Configfile: \"%s\"\n",datafile); | |
85 | + } | |
86 | + | |
87 | + /* | |
78 | 88 | if(lib3270_set_url(h,NULL)) |
79 | 89 | lib3270_set_url(h,"tn3270://fandezhi.efglobe.com"); |
80 | 90 | |
... | ... | @@ -101,6 +111,8 @@ int main(int argc, char *argv[]) |
101 | 111 | |
102 | 112 | } |
103 | 113 | |
114 | + */ | |
115 | + | |
104 | 116 | lib3270_session_free(h); |
105 | 117 | |
106 | 118 | return 0; | ... | ... |