On Tue, Apr 11, 2006 at 06:15:32PM +0200, Leopold Toetsch wrote: > > On Apr 7, 2006, at 19:38, Nicholas Clark wrote: > > >>- STRING *fill = CONST_STRING(interpreter, info->flags & > >>FLAG_ZERO ? "0" : " "); > > > > >I think that this change is masking the true bug, > > No. Above replaced line was definitely bogus. CONST_STRING is a macro > that takes *one* string constant and it has likely to be own it's own > line.
Ah. Thanks for the explanation. One literal string constant? find . -type f | grep -v text-base | xargs grep CONST_STR | grep -v '")' finds ./src/library.c: *prefix_str = CONST_STRING(interpreter, pwd); which smells fishy: if (!VTABLE_elements(interpreter, config_hash)) { const char *pwd = "."; char *ret; if (prefix_str) { *prefix_str = CONST_STRING(interpreter, pwd); return NULL; } ret = mem_sys_allocate(3); strcpy(ret, pwd); return ret; } > and the generated .str files. Improvements to that utility are welcome > to prevent such errors. If it's supposed to only ever be a literal "" string constant, Chip suggested a neat trick that we're now using in Perl 5 - in the macro get the C pre-processor to append "" to the argument. The only thing that that's valid for is a literal string. Nicholas Clark