Leopold Toetsch <[EMAIL PROTECTED]> wrote:
> - $ perl c2str.pl src/objects.c > src/objects.str
> - enable #include "objects.str" near the top of the file
> - $ make
To make it compile cleanly with gcc 2.95.2 some of the consts need to go
- or I'm to dumb to do it right ;)
So here is another version below + 2 Makefile snippets to automate
processinng:
%.str : %.c c2str.pl
perl c2str.pl $< > $@
...
$(SRC)/objects$(O) : $(GENERAL_H_FILES) $(SRC)/objects.str
We really need these constant strings badly (10-30% performance
increase). So please test it with your compiler.
BTW the string header needs probably live in the data segment - else we
might get troubles during e.g. setting the live flag on such strings.
Nethertheless we need something like this.
> see also "Constant strings - again" from yesterday.
> Thanks,
> leo
#! perl
use Text::Balanced qw(extract_bracketed);
use strict;
die "$0: Usage $0 FILE.c" unless $#ARGV == 0;
my $file = shift @ARGV;
$file =~ s/\.c$//;
my $infile = $file . '.c';
my $outfile = $file . '.str';
die "$0: $infile: $!" unless -e $infile;
print <<"HEADER";
/*
* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
*
* This file is generated automatically from '$infile'
* by $0.
*
* Any changes made here will be lost!
*
*/
#define CONCAT(a,b) a##b
#define _S(name) (__PARROT_STATIC_STR(__LINE__))
#define __PARROT_STATIC_STR(line) CONCAT(&static_string_, line)
#if ! DISABLE_GC_DEBUG
# define GC_DEBUG_VERSION ,0
#else
# define GC_DEBUG_VERSION
#endif
HEADER
my %known_strings = ();
use Math::BigInt;
sub hash_val {
my $s = substr shift, 1, -1;
my $h = new Math::BigInt->bzero();
for (my $i = 0; $i < length($s); ++$i) {
$h += $h << 5;
$h &= 0xffffffff;
$h += ord substr($s, $i, 1);
$h &= 0xffffffff;
}
return sprintf("0x%x", $h);
}
sub output_string {
my ($text, $line) = @_;
if (exists $known_strings{$text}) {
<<"DATA";
#define static_string_${line} static_string_$known_strings{$text}
DATA
}
else {
$known_strings{$text} = $line;
my $h = hash_val($text);
<<"DATA";
static /*const*/ char static_string_${line}_data\[\] = $text;
static const struct parrot_string_t static_string_${line} = {
{ /* pobj_t */
{{
static_string_${line}_data,
sizeof(static_string_${line}_data)
}},
(PObj_constant_FLAG|PObj_external_FLAG)
GC_DEBUG_VERSION
},
sizeof(static_string_${line}_data),
static_string_${line}_data,
sizeof(static_string_${line}_data) - 1,
1,
$h
};
DATA
}
}
open IN, $infile;
my $line = 0;
while (<IN>) {
$line++;
next if m/^\s*#/; # ignore preprocessor
next unless s/.*\b_S\b//;
my $str = extract_bracketed $_, '(")';
print output_string (substr($str,1,-1), $line);
}