--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lowlevellibsandfws/apputils/stringtools/stringtable.pl Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,200 @@
+# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# stringtable.pl - Makes a string table .cpp and .h file from a .st file
+# This tool takes a valid .st file as an input parameter and converts it into a .h and a .cpp file
+#
+#
+
+use strict;
+
+# Removes the extension from the filename
+$ARGV[0] =~ m/(.*)\..*/;
+my $root = $1;
+$root =~ m/(.*[\\\/])([^\\\/]*)$/;
+
+my $path_to_file = ("$1");
+my $filename = lc("$2");
+my $header_to_include = lc("$filename.h");
+
+# Open the input filename
+open (IN, "<$ARGV[0]" ) or die ("Error: $ARGV[0] $!");
+
+# Parse header comments
+my $input;
+my @comments;
+while ($input = <IN>) {
+ # Comments starting with '#' not to be included in header file
+ next if ($input =~ /^\s*\#/);
+
+ chomp($input);
+
+ # Save comments containing '!' or stop looking if something else is found
+ if ($input =~ /\!(.*)/) {
+ push(@comments, "$1\n");
+ } else {
+ last;
+ }
+}
+
+my $folding;
+# Check that line is of the right format and get the table name.
+$input =~ m/(f*stringtable) ([A-Za-z0-9_]+)/ or die ("Error: $ARGV[0] is not a stringtable file");
+my $name = $2;
+if ($1 eq "stringtable") {
+ $folding = "ETrue";
+ } else {
+ $folding = "EFalse";
+ }
+
+# Open the output filenames
+open (CPP, ">"."$path_to_file"."$filename".".cpp" ) or die ("Error: $ARGV[0] Can't open cpp file");
+open (HEADER, ">"."$path_to_file"."$filename".".h" ) or die ("Error: $ARGV[0] Can't open header file");
+
+my $sourcename = $ARGV[0];
+$sourcename =~ s/^(.*epoc32)/epoc32/i;
+
+# Output the preambles
+print CPP <<EOD;
+// Autogenerated from $sourcename by the stringtable tool - Do not edit
+#include <e32std.h>
+#include <stringpool.h>
+#include <stringtablesupport.h>
+#include "$header_to_include"
+#ifdef _DEBUG
+#undef _DEBUG
+#endif
+
+EOD
+
+print HEADER <<EOD;
+// Autogenerated from $sourcename by the stringtable tool - Do not edit
+
+#ifndef STRINGTABLE_$name
+#define STRINGTABLE_$name
+
+#include <stringpool.h>
+
+struct TStringTable;
+
+EOD
+
+# If there are no header comments, use the default comment, otherwise, add the header comments
+if (@comments == 0) {
+ print HEADER "/** A String table */\n";
+ } else {
+ print HEADER @comments;
+ }
+
+print HEADER <<EOD;
+class $name
+ {
+public:
+ enum TStrings
+ {
+EOD
+
+my $count = 0;
+my $outputcomma = 0;
+my @commentlines;
+
+#Now process file
+until (eof IN) {
+ # Treat lines with a '#' as the first character as comments and skip them, ignoring 0 or more whitespaces before it.
+ # If # is not the first character, then treat them as part of the string.
+ do
+ {
+ $input = readline (*IN);
+ chomp($input);
+ } while ($input =~ m/^\s*\#/);
+
+ if ($input =~ m/\!(.*)/) {
+ # Save lines that start with '!' to print later
+ push(@commentlines, "\t\t$1\n");
+ } else {
+ # Parse the line
+ $input =~ m/([A-Za-z0-9]+)\s*(.*)/ or die ("Error: $ARGV[0] badly formed at \"$input\"");
+
+ # If a comma needs to be printed, print it
+ if ($outputcomma == 1) {
+ print HEADER ",\n";
+ $outputcomma = 0;
+ }
+ # Print pending comments and clear the comments array
+ if (@commentlines > 0) {
+ print HEADER @commentlines;
+ @commentlines = '';
+ }
+
+ # Form a version of the string that can go in a comment. This
+ # can't contain /* or */
+ my $enum = $1;
+ my $string = $2;
+ $string =~ s/\s+$//; # remove any trailing whitespace
+ my $comment = $string;
+ $comment =~ s|/\*|/ \*|g;
+ $comment =~ s|\*/|\* /|g;
+
+ # Increment the count
+ $count++;
+ print HEADER "\t\t/** $comment */\n";
+ print HEADER "\t\t$enum";
+ print CPP "_STLIT8(K$count, \"$string\");\n";
+ $outputcomma = 1;
+ }
+}
+
+# Print closing comments
+if (@commentlines > 0) {
+ print HEADER "\n";
+ print HEADER @commentlines;
+ @commentlines = '';
+} else {
+ print HEADER "\n";
+}
+
+#Output intermediate boilerplate in the cpp
+print CPP <<EOD;
+
+// Intermediate
+const void * const KStringPointers[] =
+ {
+EOD
+
+# And the end of the headers
+print HEADER <<EOD;
+ };
+ static const TStringTable Table;
+ };
+
+#endif // STRINGTABLE_$name
+
+EOD
+
+#Output the table of pointers to the cpp file
+my $total = $count;
+
+for ($count = 1; $count <= $total ; $count++) {
+ if ($count > 1) {
+ print CPP ",\n";
+ }
+ print CPP "\t(const void*)&K$count";
+};
+
+#The last of the boilerplate
+print CPP <<EOD;
+
+ };
+
+const TStringTable ${name}::Table = {$total, KStringPointers, $folding};
+EOD