Changeset 11406


Ignore:
Timestamp:
11/30/08 20:46:59 (13 years ago)
Author:
ehuelsmann
Message:

Handle external format in Stream.java, in preparation of it being generally applicable to streams.

Location:
branches/open-external-format/src/org/armedbear/lisp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/open-external-format/src/org/armedbear/lisp/FileStream.java

    r11403 r11406  
    5555    private Writer writer;
    5656
    57     public enum EolStyle {
    58         CR,
    59         CRLF,
    60         LF
    61     }
    62    
    63     static final private Symbol keywordCodePage = Packages.internKeyword("CODE-PAGE");
    64    
    65     private final static EolStyle platformEolStyle = Utilities.isPlatformWindows ? EolStyle.CRLF : EolStyle.LF;
    66    
    67     private EolStyle eolStyle = platformEolStyle;
    68     private char eolChar = 0;
    69    
    7057    public FileStream(Pathname pathname, String namestring,
    7158                      LispObject elementType, LispObject direction,
    72                       LispObject ifExists, String encoding, EolStyle eol)
     59                      LispObject ifExists, LispObject format)
    7360        throws IOException
    7461    {
     
    115102            }
    116103        }
     104        setExternalFormat(format);
     105       
    117106  // don't touch raf directly after passing it to racf.
    118107  // the state will become inconsistent if you do that.
     
    147136      }
    148137        }
    149         eolChar = (eol == EolStyle.CR) ? '\r' : '\n';
    150138    }
    151139
     
    296284    }
    297285
    298 
     286    @Override
    299287    public void _writeChars(char[] chars, int start, int end)
    300288        throws ConditionThrowable {
     
    498486            LispObject externalFormat = sixth;
    499487           
    500             String encoding = "ISO-8859-1";
    501             if (externalFormat != NIL) {
    502     if (externalFormat instanceof Symbol) {
    503         Symbol enc = (Symbol)externalFormat; //FIXME: class cast exception to be caught
    504         if (enc != NIL) {
    505       if (enc != keywordCodePage) {
    506           encoding = enc.getName();
    507       }
    508       //FIXME: the else for the keywordCodePage to be filled in
    509         }
    510         //FIXME: the else for the == NIL to be filled in: raise an error...
    511     } else if (externalFormat instanceof AbstractString) {
    512         AbstractString encName = (AbstractString) externalFormat;
    513         encoding = encName.getStringValue();
    514     }
    515             }
    516            
    517            
    518488            if (direction != Keyword.INPUT && direction != Keyword.OUTPUT &&
    519489                direction != Keyword.IO)
     
    522492                return new FileStream(pathname, namestring.getStringValue(),
    523493                                      elementType, direction, ifExists,
    524                                       encoding, platformEolStyle);
     494                                      externalFormat);
    525495            }
    526496            catch (FileNotFoundException e) {
  • branches/open-external-format/src/org/armedbear/lisp/Stream.java

    r11404 r11406  
    8181  protected int charPos;
    8282 
     83  public enum EolStyle {
     84    RAW,
     85    CR,
     86    CRLF,
     87    LF
     88  }
     89
     90  static final private Symbol keywordDefault = Packages.internKeyword("DEFAULT");
     91 
     92  static final private Symbol keywordCodePage = Packages.internKeyword("CODE-PAGE");
     93  static final private Symbol keywordID = Packages.internKeyword("ID");
     94
     95  static final private Symbol keywordEolStyle = Packages.internKeyword("EOL-STYLE");
     96  static final private Symbol keywordCR = Packages.internKeyword("CR");
     97  static final private Symbol keywordLF = Packages.internKeyword("LF");
     98  static final private Symbol keywordCRLF = Packages.internKeyword("CRLF");
     99  static final private Symbol keywordRAW = Packages.internKeyword("RAW");
     100   
     101  public final static EolStyle platformEolStyle = Utilities.isPlatformWindows ? EolStyle.CRLF : EolStyle.LF;
     102   
     103  protected EolStyle eolStyle = platformEolStyle;
     104  protected char eolChar = 0;
     105  protected LispObject externalFormat = LispObject.NIL;
     106  protected String encoding = null;
     107 
    83108  // Binary input.
    84109  private BufferedInputStream in;
     
    216241  }
    217242
     243  public LispObject getExternalFormat() {
     244      return externalFormat;
     245  }
     246 
     247  public String getEncoding() {
     248      return encoding;
     249  }
     250 
     251  public void setExternalFormat(LispObject format) {
     252    if (format == keywordDefault) {
     253      encoding = null;
     254      eolStyle = platformEolStyle;
     255      eolChar = (eolStyle == EolStyle.CR) ? '\r' : '\n';
     256      externalFormat = format;
     257     
     258      return;
     259    }
     260     
     261    try {
     262      LispObject enc;
     263      boolean encIsCp = false;
     264     
     265      if (format instanceof Cons) {
     266          // meaning a non-empty list
     267          enc = format.car();
     268
     269          if (enc == keywordCodePage) {
     270              encIsCp = true;
     271
     272              enc = LispObject.getf(format.cdr(), keywordID, null);
     273          }
     274         
     275          LispObject eol = LispObject.getf(format.cdr(), keywordEolStyle, keywordRAW);
     276          if (eol == keywordCR)
     277              eolStyle = EolStyle.CR;
     278          else if (eol == keywordLF)
     279              eolStyle = EolStyle.LF;
     280          else if (eol == keywordCRLF)
     281              eolStyle = EolStyle.CRLF;
     282          else if (eol != keywordRAW)
     283              //###FIXME: raise an error
     284              ;
     285         
     286      } else
     287        enc = format;
     288     
     289      if (enc.numberp())
     290          encoding = enc.toString();
     291      else if (enc instanceof AbstractString)
     292          encoding = enc.getStringValue();
     293      else if (enc instanceof Symbol)
     294          encoding = ((Symbol)enc).getName();
     295      else
     296          //###FIXME: raise an error!
     297          ;
     298     
     299      if (encIsCp)
     300          encoding = "Cp" + encoding;
     301    }
     302    catch (ConditionThrowable ct) { }
     303   
     304    eolChar = (eolStyle == EolStyle.CR) ? '\r' : '\n';
     305    externalFormat = format;
     306  }
     307 
    218308  public boolean isOpen()
    219309  {
Note: See TracChangeset for help on using the changeset viewer.