/[classpath]/cp-tools/src/gnu/localegen/JavaGenerator.java
ViewVC logotype

Diff of /cp-tools/src/gnu/localegen/JavaGenerator.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.14 by glavaux, Sat Dec 18 14:08:19 2004 UTC revision 1.15 by dog, Wed Dec 22 20:59:22 2004 UTC
# Line 7  import java.io.BufferedWriter; Line 7  import java.io.BufferedWriter;
7  import java.io.PrintWriter;  import java.io.PrintWriter;
8  import java.io.IOException;  import java.io.IOException;
9  import java.util.ArrayList;  import java.util.ArrayList;
10    import java.util.Collection;
11  import java.util.Enumeration;  import java.util.Enumeration;
12  import java.util.Iterator;  import java.util.Iterator;
13  import java.util.Hashtable;  import java.util.Hashtable;
# Line 21  public class JavaGenerator Line 22  public class JavaGenerator
22  {  {
23    private static final int JAVA_HEXLENGTH = 4;    private static final int JAVA_HEXLENGTH = 4;
24    
25    private Analyzer analyzer;    private final Collection analyzers;
26    private String inPackage;    private final String locale;
27      private final String inPackage;
28    private ArrayList localeContents = new ArrayList();    private ArrayList localeContents = new ArrayList();
29    
30    private static final String[] classpathDateFormats =    private static final String[] classpathDateFormats =
# Line 58  public class JavaGenerator Line 60  public class JavaGenerator
60     */     */
61    static String convertToJavaString(String s)    static String convertToJavaString(String s)
62    {    {
     int lenOnLine = 0;  
   
63      if (s == null)      if (s == null)
64        return "null";        return "null";
65    
# Line 70  public class JavaGenerator Line 70  public class JavaGenerator
70          char c = s.charAt(i);          char c = s.charAt(i);
71          // Transform non-ASCII character into an escaped unicode character.          // Transform non-ASCII character into an escaped unicode character.
72          if (c > 127)          if (c > 127)
73              {            {
74                buf.append("\\u");              buf.append("\\u");
75                String hexString = Integer.toHexString((int)c);              String hexString = Integer.toHexString((int)c);
76                for (int j = 0; j < JAVA_HEXLENGTH-hexString.length(); j++)              for (int j = 0; j < JAVA_HEXLENGTH-hexString.length(); j++)
77                  buf.append('0');                buf.append('0');
78                buf.append(hexString);              buf.append(hexString);
79              }            }
80          else if (c == '"')          else if (c == '"')
81            {            {
82              buf.append("\\\"");              buf.append("\\\"");
# Line 87  public class JavaGenerator Line 87  public class JavaGenerator
87            }            }
88          else          else
89            buf.append(c);            buf.append(c);
           
         if (lenOnLine >= 60)  
           {  
             buf.append("\"");  
           }  
   
90        }        }
91      return buf.toString();      return buf.toString();
92    }    }
# Line 173  public class JavaGenerator Line 167  public class JavaGenerator
167          {          {
168            if (charOnLine >= 60)            if (charOnLine >= 60)
169              {              {
170                o.println('"');                o.println("\" +");
171                o.print("\t\"");                o.print("\t\"");
172                charOnLine = 0;                charOnLine = 0;
173              }              }
# Line 416  public class JavaGenerator Line 410  public class JavaGenerator
410     * Main body of the Java Locale generator.     * Main body of the Java Locale generator.
411     */     */
412    
413    public JavaGenerator(String inPackage, Analyzer analyzer)    public JavaGenerator(String inPackage, Collection analyzers, String locale)
414    {    {
415      this.analyzer = analyzer;      this.analyzers = analyzers;
416      this.inPackage = inPackage;      this.inPackage = inPackage;
417        this.locale = locale;
418    }    }
419    
420    public void addStringContent(Hashtable tree, String ref, String name)    public void addStringContent(Hashtable tree, String ref, String name)
# Line 525  public class JavaGenerator Line 520  public class JavaGenerator
520        }        }
521    }    }
522    
   private static String fixForRuleBasedCollator(String s)  
   {  
     StringBuffer sbuf = null;  
     boolean useSBUF = false;  
   
     for (int i = 0; i < s.length(); i++)  
       {  
         char c = s.charAt(i);  
   
         if (!useSBUF)  
           {  
             if ((c >= 0x0009 && c <= 0x000d) || (c >= 0x0020 && c <= 0x002F)  
                 || (c >= 0x003A && c <= 0x0040) || (c >= 0x005B && c <= 0x0060)  
                 || (c >= 0x007B && c <= 0x007E))  
             {  
               useSBUF = true;  
               sbuf = new StringBuffer();  
               sbuf.append('\'');  
               sbuf.append(s.substring(0, i+1));  
             }  
           }  
         else  
           {  
             if (s.charAt(i) == '\'')  
               sbuf.append("''");  
             else  
               sbuf.append(s.charAt(i));  
           }  
       }  
       
     if (useSBUF)  
       {  
         sbuf.append('\'');  
         return sbuf.toString();  
       }  
     else  
       return s;  
   }  
   
523    private void computeCollations(Hashtable flattree)    private void computeCollations(Hashtable flattree)
524    {    {
525      OrderedListElement listElt = (OrderedListElement)flattree.get("ldml.collations.collation.rules");      ListDataElement collations = (ListDataElement)flattree.get("ldml.collations");
526        
527        if (collations == null)
528          return;
529        
530        Hashtable table = collations.flattenLeaf("standard");
531        if (table == null)
532          return;
533        
534        System.err.println("Found UCA table for collation rules");
535        
536        OrderedListElement listElt = (OrderedListElement)table.get("collation.rules");
537      if (listElt == null)      if (listElt == null)
538        return;        return;
         
     ArrayList listData = listElt.listData;  
     StringBuffer rules = new StringBuffer();  
     char ruleCharacter;  
     boolean multiChar, prepend;  
   
     for (int i = 0; i < listData.size(); i++)  
       {  
         DataElement elt = (DataElement)listData.get(i);  
   
         if (elt.qualifiedName.equals("p"))  
           {  
             ruleCharacter = '<';  
             multiChar = false;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("s"))  
           {  
             ruleCharacter = ';';  
             multiChar = false;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("t"))  
           {  
             ruleCharacter = ',';  
             multiChar = false;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("i"))  
           {  
             ruleCharacter = '=';  
             multiChar = false;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("pc"))  
           {  
             ruleCharacter = '<';  
             multiChar = true;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("sc"))  
           {  
             ruleCharacter = ';';  
             multiChar = true;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("tc"))  
           {  
             ruleCharacter = ',';  
             multiChar = true;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("ic"))  
           {  
             ruleCharacter = '=';  
             multiChar = true;  
             prepend = false;  
           }  
         else if (elt.qualifiedName.equals("reset"))  
           {  
             ruleCharacter = '&';  
             multiChar = true;  
             prepend = false;  
           }  
         else  
           continue;  
   
         if (multiChar)  
           {  
             int insertPoint = prepend ? 0 : rules.length();  
   
             for (int j = 0; j < elt.data.length(); j++)  
               {  
                 rules.insert(insertPoint, ruleCharacter);  
                 insertPoint++;  
   
                 String s = fixForRuleBasedCollator(elt.data.substring(j, j+1));  
                   
                 rules.insert(insertPoint, s);  
                 insertPoint += s.length();  
               }  
           }  
         else  
           {  
             int insertPoint = prepend ? 0 : rules.length();  
   
             rules.insert(insertPoint, ruleCharacter);  
             insertPoint++;  
               
             rules.insert(insertPoint, fixForRuleBasedCollator(elt.data));  
           }  
       }  
539            
540      localeContents.add(new BigStringContent("collation_rules", rules.toString()));      System.err.println("Found rules");
541        
542        CollationInterpreter interp = new CollationInterpreter(listElt.listData);
543        
544        interp.compute();
545        
546        localeContents.add(new BigStringContent("collation_rules", interp.toCollationRule()));
547    }    }
548    
549    private void computeHashtable(String name, Hashtable table)    private void computeHashtable(String name, Hashtable table)
# Line 689  public class JavaGenerator Line 569  public class JavaGenerator
569        
570    private void computeContents()    private void computeContents()
571    {    {
572      Hashtable flattree = analyzer.flattenTree();      for (Iterator i = analyzers.iterator(); i.hasNext(); )
573              {
574      addStringContent(flattree, "ldml.numbers.symbols.percentSign", "percent");          Analyzer analyzer = (Analyzer) i.next();
575      addStringContent(flattree, "ldml.numbers.symbols.perMille", "perMill");          Hashtable flattree = analyzer.flattenTree();
576      addStringContent(flattree, "ldml.numbers.symbols.exponential", "exponential");          
577      addStringContent(flattree, "ldml.numbers.symbols.infinity", "infinity");          addStringContent(flattree, "ldml.numbers.symbols.percentSign", "percent");
578      addStringContent(flattree, "ldml.numbers.symbols.nan", "NaN");          addStringContent(flattree, "ldml.numbers.symbols.perMille", "perMill");
579      addStringContent(flattree, "ldml.numbers.symbols.minusSign", "minusSign");          addStringContent(flattree, "ldml.numbers.symbols.exponential", "exponential");
580      addStringContent(flattree, "ldml.numbers.symbols.nativeZeroDigit", "zeroDigit");          addStringContent(flattree, "ldml.numbers.symbols.infinity", "infinity");
581      addStringContent(flattree, "ldml.numbers.symbols.decimal", "decimalSeparator");          addStringContent(flattree, "ldml.numbers.symbols.nan", "NaN");
582      addStringContent(flattree, "ldml.numbers.symbols.group", "groupingSeparator");          addStringContent(flattree, "ldml.numbers.symbols.minusSign", "minusSign");
583      addStringContent(flattree, "ldml.numbers.symbols.patternDigit", "digit");          addStringContent(flattree, "ldml.numbers.symbols.nativeZeroDigit", "zeroDigit");
584      addStringContent(flattree, "ldml.numbers.percentFormats.percentFormatLength.percentFormat.pattern", "percentFormat");          addStringContent(flattree, "ldml.numbers.symbols.decimal", "decimalSeparator");
585      addStringContent(flattree, "ldml.numbers.currencyFormats.currencyFormatLength.currencyFormat.pattern", "currencyFormat");          addStringContent(flattree, "ldml.numbers.symbols.group", "groupingSeparator");
586      addStringContent(flattree, "ldml.dates.localizedPatternChars", "localPatternChars");          addStringContent(flattree, "ldml.numbers.symbols.patternDigit", "digit");
587            addStringContent(flattree, "ldml.numbers.percentFormats.percentFormatLength.percentFormat.pattern", "percentFormat");
588      computeCalendar(flattree);          addStringContent(flattree, "ldml.numbers.currencyFormats.currencyFormatLength.currencyFormat.pattern", "currencyFormat");
589      computeCollations(flattree);          addStringContent(flattree, "ldml.dates.localizedPatternChars", "localPatternChars");
590      computeTimeZones(flattree);          
591      computeLocalNames(flattree);          computeCalendar(flattree);
592            computeCollations(flattree);
593            computeTimeZones(flattree);
594            computeLocalNames(flattree);
595          }
596    }    }
597    
598    public void generateJavaHeader(PrintWriter o)    public void generateJavaHeader(PrintWriter o)
599    {    {
600      o.println("/* LocaleInformation_" + analyzer.getParser().getName() + ".java --");      o.println("/* LocaleInformation_" + locale + ".java --");
601      o.println("   Copyright (C) 2004  Free Software Foundation, Inc.");      o.println("   Copyright (C) 2004  Free Software Foundation, Inc.");
602      o.println();      o.println();
603      o.println("This file is part of GNU Classpath.");      o.println("This file is part of GNU Classpath.");
# Line 751  public class JavaGenerator Line 635  public class JavaGenerator
635      o.println("exception statement from your version. */");      o.println("exception statement from your version. */");
636      o.println();      o.println();
637      o.println();      o.println();
638      o.println("// This file was automatically generated by gnu.localegen from LDML " + analyzer.getParser().getName() + ".xml");      o.println("// This file was automatically generated by gnu.localegen from LDML");
639      o.println();      o.println();
640      o.println("package " + inPackage + ';');      o.println("package " + inPackage + ';');
641      o.println();      o.println();
# Line 783  public class JavaGenerator Line 667  public class JavaGenerator
667    
668    public void generateJavaClass(PrintWriter o)    public void generateJavaClass(PrintWriter o)
669    {    {
670      o.println("public class LocaleInformation_" + analyzer.getParser().getName() + " extends ListResourceBundle");      o.println("public class LocaleInformation_" + locale + " extends ListResourceBundle");
671      o.println("{");      o.println("{");
672    
673      for (int i=0;i<localeContents.size();i++)      for (int i=0;i<localeContents.size();i++)
# Line 814  public class JavaGenerator Line 698  public class JavaGenerator
698            
699      javaDir.mkdirs();      javaDir.mkdirs();
700    
701      File javaFile = new File(javaDir, "LocaleInformation_" + analyzer.getParser().getName() + ".java");      File javaFile = new File(javaDir, "LocaleInformation_" + locale + ".java");
702    
703      computeContents();      computeContents();
704    

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26