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
| @@ -82,6 +82,8 @@ datarootdir=@datarootdir@ | @@ -82,6 +82,8 @@ datarootdir=@datarootdir@ | ||
| 82 | localedir=@localedir@ | 82 | localedir=@localedir@ |
| 83 | docdir=@docdir@ | 83 | docdir=@docdir@ |
| 84 | sysconfdir=@sysconfdir@ | 84 | sysconfdir=@sysconfdir@ |
| 85 | +datadir=$(datarootdir)/$(PRODUCT_NAME) | ||
| 86 | +confdir=$(sysconfdir)/$(PRODUCT_NAME) | ||
| 85 | 87 | ||
| 86 | BASEDIR=@BASEDIR@ | 88 | BASEDIR=@BASEDIR@ |
| 87 | 89 |
src/core/linux/util.c
| @@ -34,14 +34,59 @@ | @@ -34,14 +34,59 @@ | ||
| 34 | 34 | ||
| 35 | 35 | ||
| 36 | #include <config.h> | 36 | #include <config.h> |
| 37 | +#include <stdarg.h> | ||
| 37 | #include <lib3270-internals.h> | 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,6 +249,34 @@ int gettimeofday(struct timeval *tv, void GNUC_UNUSED(*ignored)) | ||
| 249 | return 0; | 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 | LIB3270_EXPORT char * lib3270_build_data_filename(const char *name) | 280 | LIB3270_EXPORT char * lib3270_build_data_filename(const char *name) |
| 253 | { | 281 | { |
| 254 | // https://github.com/GNOME/glib/blob/master/glib/gwin32.c | 282 | // https://github.com/GNOME/glib/blob/master/glib/gwin32.c |
| @@ -274,31 +302,77 @@ char * lib3270_build_config_filename(const char *name) | @@ -274,31 +302,77 @@ char * lib3270_build_config_filename(const char *name) | ||
| 274 | // On windows the data and config path are the same. | 302 | // On windows the data and config path are the same. |
| 275 | return lib3270_build_data_filename(name); | 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 | if(ptr) | 323 | if(ptr) |
| 288 | ptr[1] = 0; | 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,18 +51,22 @@ | ||
| 51 | 51 | ||
| 52 | #define LIB3270_GNUC_FORMAT(s,f) __attribute__ ((__format__ (__printf__, s, f))) | 52 | #define LIB3270_GNUC_FORMAT(s,f) __attribute__ ((__format__ (__printf__, s, f))) |
| 53 | #define LIB3270_DEPRECATED(func) func __attribute__ ((deprecated)) | 53 | #define LIB3270_DEPRECATED(func) func __attribute__ ((deprecated)) |
| 54 | + #define LIB3270_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) | ||
| 54 | 55 | ||
| 55 | #elif defined(_WIN32) | 56 | #elif defined(_WIN32) |
| 56 | 57 | ||
| 57 | #define LIB3270_DEPRECATED(func) __declspec(deprecated) func | 58 | #define LIB3270_DEPRECATED(func) __declspec(deprecated) func |
| 59 | + #define LIB3270_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) | ||
| 58 | 60 | ||
| 59 | #elif defined(__LCLINT__) | 61 | #elif defined(__LCLINT__) |
| 60 | 62 | ||
| 61 | #define LIB3270_DEPRECATED(func) func | 63 | #define LIB3270_DEPRECATED(func) func |
| 64 | + #define LIB3270_GNUC_NULL_TERMINATED | ||
| 62 | 65 | ||
| 63 | #else | 66 | #else |
| 64 | 67 | ||
| 65 | #define LIB3270_DEPRECATED(func) func | 68 | #define LIB3270_DEPRECATED(func) func |
| 69 | + #define LIB3270_GNUC_NULL_TERMINATED | ||
| 66 | 70 | ||
| 67 | #endif | 71 | #endif |
| 68 | 72 | ||
| @@ -1484,9 +1488,9 @@ | @@ -1484,9 +1488,9 @@ | ||
| 1484 | * @return Full path for the file (release it with lib3270_free). | 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 | LIB3270_EXPORT void lib3270_set_session_id(H3270 *hSession, char id); | 1495 | LIB3270_EXPORT void lib3270_set_session_id(H3270 *hSession, char id); |
| 1492 | LIB3270_EXPORT char lib3270_get_session_id(H3270 *hSession); | 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,10 +38,9 @@ int main(int argc, char *argv[]) | ||
| 38 | }; | 38 | }; |
| 39 | // #pragma GCC diagnostic pop | 39 | // #pragma GCC diagnostic pop |
| 40 | 40 | ||
| 41 | - H3270 * h; | 41 | + H3270 * h = lib3270_session_new(""); |
| 42 | int rc = 0; | 42 | int rc = 0; |
| 43 | 43 | ||
| 44 | - h = lib3270_session_new(""); | ||
| 45 | printf("3270 session %p created\n]",h); | 44 | printf("3270 session %p created\n]",h); |
| 46 | 45 | ||
| 47 | lib3270_set_url(h,NULL); | 46 | lib3270_set_url(h,NULL); |
| @@ -75,6 +74,17 @@ int main(int argc, char *argv[]) | @@ -75,6 +74,17 @@ int main(int argc, char *argv[]) | ||
| 75 | } | 74 | } |
| 76 | #endif // _WIN32 | 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 | if(lib3270_set_url(h,NULL)) | 88 | if(lib3270_set_url(h,NULL)) |
| 79 | lib3270_set_url(h,"tn3270://fandezhi.efglobe.com"); | 89 | lib3270_set_url(h,"tn3270://fandezhi.efglobe.com"); |
| 80 | 90 | ||
| @@ -101,6 +111,8 @@ int main(int argc, char *argv[]) | @@ -101,6 +111,8 @@ int main(int argc, char *argv[]) | ||
| 101 | 111 | ||
| 102 | } | 112 | } |
| 103 | 113 | ||
| 114 | + */ | ||
| 115 | + | ||
| 104 | lib3270_session_free(h); | 116 | lib3270_session_free(h); |
| 105 | 117 | ||
| 106 | return 0; | 118 | return 0; |