home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / text / rtf / RTFParser.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  4.7 KB  |  268 lines

  1. package com.sun.java.swing.text.rtf;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.PrintStream;
  6.  
  7. abstract class RTFParser extends AbstractFilter {
  8.    public int level = 0;
  9.    private int state = 0;
  10.    private StringBuffer currentCharacters = new StringBuffer();
  11.    private String pendingKeyword = null;
  12.    private int pendingCharacter;
  13.    private long binaryBytesLeft;
  14.    ByteArrayOutputStream binaryBuf;
  15.    private boolean[] savedSpecials;
  16.    protected PrintStream warnings;
  17.    private final int S_text;
  18.    private final int S_backslashed = 1;
  19.    private final int S_token = 2;
  20.    private final int S_parameter = 3;
  21.    private final int S_aftertick = 4;
  22.    private final int S_aftertickc = 5;
  23.    private final int S_inblob = 6;
  24.    static final boolean[] rtfSpecialsTable;
  25.  
  26.    public abstract boolean handleKeyword(String var1);
  27.  
  28.    public abstract boolean handleKeyword(String var1, int var2);
  29.  
  30.    public abstract void handleText(String var1);
  31.  
  32.    public void handleText(char var1) {
  33.       this.handleText(String.valueOf(var1));
  34.    }
  35.  
  36.    public abstract void handleBinaryBlob(byte[] var1);
  37.  
  38.    public abstract void begingroup();
  39.  
  40.    public abstract void endgroup();
  41.  
  42.    public RTFParser() {
  43.       this.warnings = System.out;
  44.       super.specialsTable = rtfSpecialsTable;
  45.    }
  46.  
  47.    public void writeSpecial(int var1) throws IOException {
  48.       this.write((char)var1);
  49.    }
  50.  
  51.    public void write(String var1) throws IOException {
  52.       if (this.state != 0) {
  53.          int var2 = 0;
  54.  
  55.          int var3;
  56.          for(var3 = var1.length(); var2 < var3 && this.state != 0; ++var2) {
  57.             this.write(var1.charAt(var2));
  58.          }
  59.  
  60.          if (var2 >= var3) {
  61.             return;
  62.          }
  63.  
  64.          var1 = var1.substring(var2);
  65.       }
  66.  
  67.       if (this.currentCharacters.length() > 0) {
  68.          this.currentCharacters.append(var1);
  69.       } else {
  70.          this.handleText(var1);
  71.       }
  72.    }
  73.  
  74.    public void write(char var1) throws IOException {
  75.       switch (this.state) {
  76.          case 0:
  77.             if (var1 != '\n') {
  78.                if (var1 == '\r') {
  79.                   return;
  80.                }
  81.  
  82.                if (var1 == '{') {
  83.                   if (this.currentCharacters.length() > 0) {
  84.                      this.handleText(this.currentCharacters.toString());
  85.                      this.currentCharacters = new StringBuffer();
  86.                   }
  87.  
  88.                   ++this.level;
  89.                   this.begingroup();
  90.                   return;
  91.                }
  92.  
  93.                if (var1 == '}') {
  94.                   if (this.currentCharacters.length() > 0) {
  95.                      this.handleText(this.currentCharacters.toString());
  96.                      this.currentCharacters = new StringBuffer();
  97.                   }
  98.  
  99.                   if (this.level == 0) {
  100.                      throw new IOException("Too many close-groups in RTF text");
  101.                   }
  102.  
  103.                   this.endgroup();
  104.                   --this.level;
  105.                   return;
  106.                }
  107.  
  108.                if (var1 == '\\') {
  109.                   if (this.currentCharacters.length() > 0) {
  110.                      this.handleText(this.currentCharacters.toString());
  111.                      this.currentCharacters = new StringBuffer();
  112.                   }
  113.  
  114.                   this.state = 1;
  115.                   return;
  116.                }
  117.  
  118.                this.currentCharacters.append(var1);
  119.                return;
  120.             }
  121.             break;
  122.          case 1:
  123.             if (var1 == '\'') {
  124.                this.state = 4;
  125.                return;
  126.             }
  127.  
  128.             if (!Character.isLetter(var1)) {
  129.                char[] var8 = new char[]{var1};
  130.                if (!this.handleKeyword(new String(var8))) {
  131.                   this.warnings.println("Unknown keyword: " + var8 + " (" + (byte)var1 + ")");
  132.                }
  133.  
  134.                this.state = 0;
  135.                this.pendingKeyword = null;
  136.                return;
  137.             }
  138.  
  139.             this.state = 2;
  140.          case 2:
  141.             if (Character.isLetter(var1)) {
  142.                this.currentCharacters.append(var1);
  143.                return;
  144.             }
  145.  
  146.             this.pendingKeyword = this.currentCharacters.toString();
  147.             this.currentCharacters = new StringBuffer();
  148.             if (Character.isDigit(var1) || var1 == '-') {
  149.                this.state = 3;
  150.                this.currentCharacters.append(var1);
  151.                return;
  152.             }
  153.  
  154.             boolean var6 = this.handleKeyword(this.pendingKeyword);
  155.             if (!var6) {
  156.                this.warnings.println("Unknown keyword: " + this.pendingKeyword);
  157.             }
  158.  
  159.             this.pendingKeyword = null;
  160.             this.state = 0;
  161.             if (!Character.isWhitespace(var1)) {
  162.                this.write(var1);
  163.                return;
  164.             }
  165.             break;
  166.          case 3:
  167.             if (Character.isDigit(var1)) {
  168.                this.currentCharacters.append(var1);
  169.                return;
  170.             }
  171.  
  172.             if (this.pendingKeyword.equals("bin")) {
  173.                long var7 = Long.parseLong(this.currentCharacters.toString());
  174.                this.pendingKeyword = null;
  175.                this.state = 6;
  176.                this.binaryBytesLeft = var7;
  177.                if (this.binaryBytesLeft > 2147483647L) {
  178.                   this.binaryBuf = new ByteArrayOutputStream(Integer.MAX_VALUE);
  179.                } else {
  180.                   this.binaryBuf = new ByteArrayOutputStream((int)this.binaryBytesLeft);
  181.                }
  182.  
  183.                this.savedSpecials = super.specialsTable;
  184.                super.specialsTable = AbstractFilter.allSpecialsTable;
  185.                return;
  186.             }
  187.  
  188.             int var3 = Integer.parseInt(this.currentCharacters.toString());
  189.             boolean var2 = this.handleKeyword(this.pendingKeyword, var3);
  190.             if (!var2) {
  191.                this.warnings.println("Unknown keyword: " + this.pendingKeyword + " (param " + this.currentCharacters + ")");
  192.             }
  193.  
  194.             this.pendingKeyword = null;
  195.             this.currentCharacters = new StringBuffer();
  196.             this.state = 0;
  197.             if (!Character.isWhitespace(var1)) {
  198.                this.write(var1);
  199.                return;
  200.             }
  201.             break;
  202.          case 4:
  203.             if (Character.digit(var1, 16) == -1) {
  204.                this.state = 0;
  205.                return;
  206.             }
  207.  
  208.             this.pendingCharacter = Character.digit(var1, 16);
  209.             this.state = 5;
  210.             return;
  211.          case 5:
  212.             this.state = 0;
  213.             if (Character.digit(var1, 16) != -1) {
  214.                this.pendingCharacter = this.pendingCharacter * 16 + Character.digit(var1, 16);
  215.                var1 = super.translationTable[this.pendingCharacter];
  216.                if (var1 != 0) {
  217.                   this.handleText(var1);
  218.                   return;
  219.                }
  220.             }
  221.             break;
  222.          case 6:
  223.             this.binaryBuf.write(var1);
  224.             --this.binaryBytesLeft;
  225.             if (this.binaryBytesLeft == 0L) {
  226.                this.state = 0;
  227.                super.specialsTable = this.savedSpecials;
  228.                this.savedSpecials = null;
  229.                this.handleBinaryBlob(this.binaryBuf.toByteArray());
  230.                this.binaryBuf = null;
  231.             }
  232.       }
  233.  
  234.    }
  235.  
  236.    public void flush() throws IOException {
  237.       super.flush();
  238.       if (this.state == 0 && this.currentCharacters.length() > 0) {
  239.          this.handleText(this.currentCharacters.toString());
  240.          this.currentCharacters = new StringBuffer();
  241.       }
  242.  
  243.    }
  244.  
  245.    public void close() throws IOException {
  246.       this.flush();
  247.       if (this.state != 0 || this.level > 0) {
  248.          this.warnings.println("Truncated RTF file.");
  249.  
  250.          while(this.level > 0) {
  251.             this.endgroup();
  252.             --this.level;
  253.          }
  254.       }
  255.  
  256.       super.close();
  257.    }
  258.  
  259.    static {
  260.       rtfSpecialsTable = (boolean[])AbstractFilter.noSpecialsTable.clone();
  261.       rtfSpecialsTable[10] = true;
  262.       rtfSpecialsTable[13] = true;
  263.       rtfSpecialsTable[123] = true;
  264.       rtfSpecialsTable[125] = true;
  265.       rtfSpecialsTable[92] = true;
  266.    }
  267. }
  268.