# New Ticket Created by Mike Mattie # Please include the string: [perl #41900] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=41900 >
This patch hoists the finalization of a path with a invisible cstr terminator into a function path_finalize removing duplicated code, and making the Parrot_locate_runtime_str function self-documenting with named procedures. I have compile tested, and suite tested on linux-i386. Other platforms should not be affected AFAICT. This series of re-factors serves three purposes: 1. remove code duplication, review code. 2. create path functions that can later be reviewed on a API level , and moved into their own file for use across the project. 3. simplify Parrot_locate_runtime_str so my later feature enhancement of Parrot_locate_runtime_str will balance out complexity wise instead of increasing the complexity. I will introduce the enhancement of Parrot_locate_runtime_str at the end of this cleanup series. Patch is against rev 17626, my last change to src/library.c
--- HEAD/src/library.c 2007-03-18 18:20:55.000000000 -0700 +++ parrot-0.4.9.test/src/library.c 2007-03-18 21:27:52.000000000 -0700 @@ -175,6 +178,28 @@ } #endif +static STRING* +path_finalize(Interp *interp, STRING *path ) +{ + + /* TODO create a string API that just does that + * a lot of ICU lib functions also need 0-terminated strings + * the goal is just to have for sure an invisible 0 at end + */ + + STRING *nul = string_from_const_cstring(interp, "\0", 1); + + path = string_append(interp, path, nul); + path->bufused--; + path->strlen--; + +#ifdef WIN32 + cnv_to_win32_filesep( path ); +#endif + + return path; +} + /* =item C<char* Parrot_locate_runtime_file(Interp *, const char *file_name, @@ -203,7 +228,7 @@ Parrot_locate_runtime_file_str(Interp *interp, STRING *file, enum_runtime_ft type) { - STRING *prefix, *path, *full_name, *slash, *nul; + STRING *prefix, *path, *full_name, *slash; INTVAL i, n; PMC *paths; @@ -224,7 +249,6 @@ slash = CONST_STRING(interp, "/"); #endif - nul = string_from_const_cstring(interp, "\0", 1); Parrot_get_runtime_prefix(interp, &prefix); n = VTABLE_elements(interp, paths); for (i = 0; i < n; ++i) { @@ -243,34 +267,18 @@ full_name = string_append(interp, full_name, slash); full_name = string_append(interp, full_name, file); - /* TODO create a string API that just does that - * a lot of ICU lib functions also need 0-terminated strings - * the goal is just to have for sure an invisible 0 at end - */ - full_name = string_append(interp, full_name, nul); - full_name->bufused--; - full_name->strlen--; - -#ifdef WIN32 - cnv_to_win32_filesep( full_name ); -#endif + full_name = path_finalize(interp, full_name ); if (Parrot_stat_info_intval(interp, full_name, STAT_EXISTS)) { return full_name; } } - /* finally try as is */ - full_name = string_append(interp, file, nul); - full_name->bufused--; - full_name->strlen--; - -#ifdef WIN32 - cnv_to_win32_filesep( full_name ); -#endif + full_name = path_finalize( interp, file ); if (Parrot_stat_info_intval(interp, full_name, STAT_EXISTS)) { return full_name; } + return NULL; }
signature.asc
Description: PGP signature