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; | ... | ... |