ReaderTypespec.java :  » Scripting » Kawa » gnu » kawa » lispexpr » Java Open Source

Java Open Source » Scripting » Kawa 
Kawa » gnu » kawa » lispexpr » ReaderTypespec.java
// Copyright (c) 2001  Per M.A. Bothner
// This is free software;  for terms and warranty disclaimer see ./COPYING.

package gnu.kawa.lispexpr;
import gnu.text.*;
import gnu.mapping.InPort;

/** Reader table entry for '<' to treat '[' and ']' as constituents.
 * Lets us use (say) '<char[]>' as a token even if  '[' and ']' are parens.
 * @author Bruce R. Lewis.
 */

public class ReaderTypespec extends ReadTableEntry
{
  public int getKind()
  {
    return ReadTable.NON_TERMINATING_MACRO;
  }

  public Object read (Lexer in, int ch, int count)
    throws java.io.IOException, SyntaxException
  {
    int startPos = in.tokenBufferLength;
    LineBufferedReader port = in.getPort();
    ReadTable rtable = ReadTable.getCurrent();
    ReadTableEntry entry;
    char saveReadState = '\0';
    in.tokenBufferAppend(ch);
    int c = ch;
    int prev;
    if (port instanceof InPort)
      {
  saveReadState = ((InPort) port).readState;
  ((InPort) port).readState = (char) ch;
      }
    try
      {
  boolean got_open_square = false;
  for (;;)
    {
      int next;

      prev = c;

      if (port.pos < port.limit && prev != '\n')
        c = port.buffer[port.pos++];
      else
        c = port.read();
      if (c == '\\')
        {
    if (in instanceof LispReader)
      c = ((LispReader) in).readEscape();
    else
      c = port.read();
        }
      else
        {
    if ( (!got_open_square && c == '['
          && true == (got_open_square = true))
         || (got_open_square && c == ']'
       && false == (got_open_square = false))
         || (null != (entry = rtable.lookup(c))
       && entry.getKind() == ReadTable.CONSTITUENT))
      {
          in.tokenBufferAppend(c);
          continue;
      }
    else
      {
        in.unread(c);
        break;
      }
        }
      }
  return (new java.lang.String (in.tokenBuffer, startPos,
              in.tokenBufferLength - startPos)).intern();
      }
    finally
      {
  in.tokenBufferLength = startPos;
  if (port instanceof InPort)
    ((InPort) port).readState = saveReadState;
      }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.