lowlevellibsandfws/apputils/stringtools/stringtable.pl
changeset 0 e4d67989cc36
--- /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