This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. USING IDSWITCH GENERATOR TOOL Usage: java org.mozilla.javascript.tools.idswitch.Main The main purpose of this utility is to generate Java code to map strings to some ids that can be used, for example, in a switch statement. The utility scans the input file for lines with the following structure: // #string_id_map# ... // #generated# ... // #/generated# ... // #/string_id_map# Then every line in is scanned for the pattern: ^[ \t]*Id_([0-9a-zA-Z_]+)[ \t]*=.*$ Each such patterns adds a mapping form string $1 to Id_\$ or if the line also contains the pattern //\s*#string=\s*([^#]+)\s*#, then it adds map of $1 in this pattern to Id_\$ After that lines in are replaced by a code block that sets variable "id" to Id_ if variable "s" equals (or value defined by //#string=...# construction in the line with Id_) or 0 otherwise. If the new code for is identical to old one, the file is not touched otherwise is overwritten by the new code and a time stamp is appended after #generated#. For example, if file x.java contains: // #string_id_map# private int getId(String s) { int id; // #generated# Initial version // #/generated# return id; } private static final int Id_x = 1, Id_y = 2, Id_hello = 3, // #string = Hello, World! # Id_symbols = 4, // #string=<<*Symbols*>># Id_nice = 5, Id_for = 6, Id_bar = 7; // #/string_id_map# .... private double getFieldValue(String s) { // #string_id_map# final int Id_field1 = 1, Id_field2 = 2, Id_field3 = 3, Id_one_more_field = 4; // #string = ONE%MORE%FIELD# int id; // #generated# Initial version // #/generated# // #/string_id_map# switch (id) { case Id_field1: return field1; case Id_field2: return field2; case Id_field3: return field3; case Id_one_more_field: return one_more_field; } throw new RuntimeException("No such field"); } then invocation java org.mozilla.javascript.tools.idswitch.Main x.java would replace that by a code fragment similar to: // #string_id_map# private int getId(String s) { int id; // #generated# Last update: 2001-05-25 18:00:24 GMT+02:00 L0: { id = 0; String X = null; int c; L: switch (s.length()) { case 1: c=s.charAt(0); if (c=='x') { id=Id_x; break L0; } else if (c=='y') { id=Id_y; break L0; } break L; case 3: c=s.charAt(0); if (c=='b') { if (s.charAt(2)=='r' && s.charAt(1)=='a') {id=Id_bar; break L0;} } else if (c=='f') { if (s.charAt(2)=='r' && s.charAt(1)=='o') {id=Id_for; break L0;} } break L; case 4: X="nice";id=Id_nice; break L; case 13: c=s.charAt(0); if (c=='<') { X="<<*Symbols*>>";id=Id_symbols; } else if (c=='H') { X="Hello, World!";id=Id_hello; } break L; } if (X!=null && X!=s && !X.equals(s)) id = 0; } // #/generated# return id; } private static final int Id_x = 1, Id_y = 2, Id_hello = 3, // #string = Hello, World! # Id_symbols = 4, // #string=<<*Symbols*>># Id_nice = 5, Id_for = 6, Id_bar = 7; // #/string_id_map# .... private double getFieldValue(String s) { // #string_id_map# final int Id_field1 = 1, Id_field2 = 2, Id_field3 = 3, Id_one_more_field = 4; // #string = ONE%MORE%FIELD# int id; // #generated# Last update: 2001-05-25 16:48:50 GMT+02:00 L0: { id = 0; String X = null; int c; int s_length = s.length(); if (s_length==6) { c=s.charAt(5); if (c=='1') { X="field1";id=Id_field1; } else if (c=='2') { X="field2";id=Id_field2; } else if (c=='3') { X="field3";id=Id_field3; } } else if (s_length==14) { X="ONE%MORE%FIELD";id=Id_one_more_field; } if (X!=null && X!=s && !X.equals(s)) id = 0; } // #/generated# // #/string_id_map# switch (id) { case Id_field1: return field1; case Id_field2: return field2; case Id_field3: return field3; case Id_one_more_field: return one_more_field; } throw new RuntimeException("No such field"); }