Changeset 141


Ignore:
Timestamp:
10/15/02 00:25:48 (21 years ago)
Author:
piso
Message:

Major cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/j/LispFormatter.java

    r2 r141  
    33 *
    44 * Copyright (C) 1998-2002 Peter Graves
    5  * $Id: LispFormatter.java,v 1.1.1.1 2002-09-24 16:09:34 piso Exp $
     5 * $Id: LispFormatter.java,v 1.2 2002-10-15 00:25:48 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    3232    private static final int LISP_FORMAT_NUMBER   = 5;
    3333
    34     private FastStringBuffer sb = new FastStringBuffer();
    35     private int tokStart;
     34    private final Mode mode;
    3635
    3736    public LispFormatter(Buffer buffer)
    3837    {
    3938        this.buffer = buffer;
    40     }
    41 
    42     private void endToken(int state)
    43     {
    44         if (sb.length() > 0) {
     39        this.mode = buffer.getMode();
     40    }
     41
     42    private int tokenBegin = 0;
     43
     44    private void endToken(String text, int tokenEnd, int state)
     45    {
     46        if (tokenEnd - tokenBegin > 0) {
    4547            int format = -1;
    4648            switch (state) {
     
    6062                    break;
    6163            }
    62             addSegment(sb.toString(), format);
    63             tokStart += sb.length();
    64             sb.setLength(0);
    65         }
    66     }
    67 
    68     private void parseLine(String text, int state)
    69     {
    70         if (Editor.tabsAreVisible())
    71             text = Utilities.makeTabsVisible(text, buffer.getTabWidth());
    72         else
    73             text = Utilities.detab(text, buffer.getTabWidth());
     64            addSegment(text, tokenBegin, tokenEnd, format);
     65            tokenBegin = tokenEnd;
     66        }
     67    }
     68
     69    private void parseLine(Line line)
     70    {
     71        final String text = getDetabbedText(line);
     72        tokenBegin = 0;
     73        int state = line.flags();
    7474        clearSegmentList();
    75         sb.setLength(0);
     75        final int limit = text.length();
    7676        int i = 0;
    77         tokStart = 0;
    78         int limit = text.length();
    79         char c;
    8077        // Skip whitespace at start of line.
    8178        while (i < limit) {
    82             c = text.charAt(i);
    83             if (Character.isWhitespace(c)) {
    84                 sb.append(c);
     79            if (Character.isWhitespace(text.charAt(i))) {
    8580                ++i;
    8681            } else {
    87                 endToken(state);
     82                endToken(text, i, state);
    8883                break;
    8984            }
    9085        }
    9186        while (i < limit) {
    92             c = text.charAt(i);
     87            char c = text.charAt(i);
    9388            if (c == '\\' && i < limit-1) {
    94                 sb.append(c);
    95                 sb.append(text.charAt(++i));
    96                 ++i;
     89                i += 2;
    9790                continue;
    9891            }
     
    10194                    c = text.charAt(i+1);
    10295                    if (c == '#') {
    103                         sb.append("|#");
    104                         endToken(state);
     96                        endToken(text, i, state);
    10597                        state = STATE_NEUTRAL;
    10698                        i += 2;
     
    108100                    }
    109101                }
    110                 sb.append(c);
    111102                ++i;
    112103                continue;
    113104            }
    114105            if (state == STATE_QUOTE) {
    115                 sb.append(c);
    116106                if (c == '"') {
    117                     endToken(state);
     107                    endToken(text, i, state);
    118108                    state = STATE_NEUTRAL;
    119109                }
     
    123113            // Reaching here, we're not in a comment or quoted string.
    124114            if (c == '"') {
    125                 endToken(state);
    126                 sb.append(c);
     115                endToken(text, i, state);
    127116                state = STATE_QUOTE;
    128117                ++i;
     
    130119            }
    131120            if (c == ';') {
    132                 endToken(state);
    133                 state = STATE_COMMENT;
    134                 sb.append(text.substring(i));
    135                 endToken(state);
     121                endToken(text, i, state);
     122                endToken(text, limit, STATE_COMMENT);
    136123                return;
    137124            }
    138125            if (c == '#' && i < limit-1) {
    139126                if (text.charAt(i+1) == '|') {
    140                     endToken(state);
     127                    endToken(text, i, state);
    141128                    state = STATE_COMMENT;
    142                     sb.append("#|");
    143129                    i += 2;
    144130                    continue;
     
    146132            }
    147133            if (state == STATE_IDENTIFIER) {
    148                 if (buffer.mode.isIdentifierPart(c))
    149                     sb.append(c);
    150                 else {
    151                     endToken(state);
    152                     sb.append(c);
     134                if (!mode.isIdentifierPart(c)) {
     135                    endToken(text, i, state);
    153136                    state = STATE_NEUTRAL;
    154137                }
     
    158141            if (state == STATE_NUMBER) {
    159142                if (Character.isDigit(c))
    160                     sb.append(c);
     143                    ;
    161144                else if (c == 'u' || c == 'U' || c == 'l' || c == 'L')
    162                     sb.append(c); // Valid suffix.
    163                 else if (sb.length() == 1 && c == 'x' || c == 'X') {
    164                     sb.append(c);
     145                    ;
     146                else if (i - tokenBegin == 1 && c == 'x' || c == 'X')
    165147                    state = STATE_HEXNUMBER;
    166                 } else {
    167                     endToken(state);
    168                     sb.append(c);
     148                else {
     149                    endToken(text, i, state);
    169150                    if (Character.isJavaIdentifierStart(c))
    170151                        state = STATE_IDENTIFIER;
     
    177158            if (state == STATE_HEXNUMBER) {
    178159                if (Character.isDigit(c))
    179                     sb.append(c);
     160                    ;
    180161                else if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))
    181                     sb.append(c);
     162                    ;
    182163                else if (c == 'u' || c == 'U' || c == 'l' || c == 'L')
    183                     sb.append(c); // Valid suffix.
     164                    ;
    184165                else {
    185                     endToken(state);
    186                     sb.append(c);
     166                    endToken(text, i, state);
    187167                    if (Character.isJavaIdentifierStart(c))
    188168                        state = STATE_IDENTIFIER;
     
    194174            }
    195175            if (state == STATE_NEUTRAL) {
    196                 if (buffer.getMode().isIdentifierStart(c)) {
    197                     endToken(state);
    198                     sb.append(c);
     176                if (mode.isIdentifierStart(c)) {
     177                    endToken(text, i, state);
    199178                    state = STATE_IDENTIFIER;
    200179                } else if (Character.isDigit(c)) {
    201                     endToken(state);
    202                     sb.append(c);
     180                    endToken(text, i, state);
    203181                    state = STATE_NUMBER;
    204182                } else // Still neutral...
    205                     sb.append(c);
     183                    ;
    206184            }
    207185            ++i;
    208186        }
    209         endToken(state);
     187        endToken(text, i, state);
    210188    }
    211189
     
    217195            return segmentList;
    218196        }
    219         parseLine(line.getText(), line.flags());
     197        parseLine(line);
    220198        final int size = segmentList.size();
    221199        for (int i = 0; i < size; i++) {
Note: See TracChangeset for help on using the changeset viewer.