-- MailParsePrivate.mesa -- Last edited by Levin: 19-Feb-81 9:23:09 -- Willie-Sue: 3-Mar-82 10:34:34 DIRECTORY MailParse USING [NameInfo, NameType]; MailParsePrivate: DEFINITIONS = BEGIN -- Some special characters specified by RFC 733 -- openComment: CHARACTER = '(; closeComment: CHARACTER = '); quoteNext: CHARACTER = '\\; stringQuote: CHARACTER = '"; nameSeparator: CHARACTER = ',; -- Inter-module communication -- ParseHandle: TYPE = LONG POINTER TO ParseInfo; ParseInfo: TYPE = RECORD [ nextChar: PROCEDURE RETURNS [CHARACTER], backUp: PROCEDURE, write: PROCEDURE [CHARACTER] ← NULL, process: PROCEDURE [STRING, STRING, STRING, MailParse.NameInfo] RETURNS [BOOLEAN] ← NULL, lexHead: Lexeme ← NIL, dotLex, atLex: Lexeme ← NULL, simpleName, registry, arpaHost: STRING ← NIL, bufferList, cache: CharBuffer ← NIL, nameInfo: MailParse.NameInfo ← NULL, lexStart: CharIndex ← NULL, freeLexHead, tagLexList, preludeLexList: Lexeme ← NIL, signalTruncation: BOOLEAN, nameOutput, outputThisLevel, suppressWhiteSpace, scanningTag: BOOLEAN ← NULL, cantFinalize, recordingChars: BOOLEAN ← FALSE, nameSeen: BOOLEAN ← NULL, -- hack used only to detect MSG dl names (like CSL:) spaceState: SpaceState ← NULL, curLexType: LexemeType ← NULL, preludeOut: CharIndex ← 0]; SpaceState: TYPE = {initial, white, black}; TagOrPrelude: TYPE = {tag, prelude}; -- Procedures for name list parsing and output -- RecurForBrackets: PROCEDURE [pH: ParseHandle, opener, terminator: CHARACTER]; AccumulateComment: PROCEDURE [pH: ParseHandle]; AccumulateQuotedString: PROCEDURE [pH: ParseHandle]; AccumulateFileName: PROCEDURE [pH: ParseHandle]; AccumulateTagOrPrelude: PROCEDURE [pH: ParseHandle] RETURNS [TagOrPrelude]; ParseList: PROCEDURE [pH: ParseHandle, terminator: CHARACTER]; BuildMSGdlAtom: PROCEDURE [pH: ParseHandle]; OutputName: PROCEDURE [pH: ParseHandle]; SyntaxError: ERROR; -- Lexeme Handling Utilities -- Lexeme: TYPE = POINTER TO Lex; Lex: TYPE = RECORD [ next, prev: Lexeme, type: LexemeType, length: [0..17777B], start: CharIndex]; LexemeType: TYPE = {atom, dot, at, space, prelude, null, head}; Magnitude: TYPE = {none, one, many}; InitializeLexicalStorage: PROCEDURE [pH: ParseHandle]; FinalizeLexicalStorage: PROCEDURE [pH: ParseHandle]; ResetLexicalStorage: PROCEDURE [pH: ParseHandle]; LexemeCount: PROCEDURE [pH: ParseHandle] RETURNS [Magnitude]; EmptyLexemeListOrSpace: PROCEDURE [pH: ParseHandle] RETURNS [BOOLEAN]; MakeLexeme: PROCEDURE [ pH: ParseHandle, type: LexemeType, start: CharIndex ← 0, length: CARDINAL ← 0] RETURNS [lex: Lexeme]; MakeLexemeFromString: PROCEDURE [pH: ParseHandle, type: LexemeType, s: STRING] RETURNS [lex: Lexeme]; MaybeNewLexeme: PROCEDURE [pH: ParseHandle, new: LexemeType]; TerminateLexeme: PROCEDURE [pH: ParseHandle] = INLINE {MaybeNewLexeme[pH, null]}; AppendLexemeValue: PROCEDURE [pH: ParseHandle, s: STRING, lex: Lexeme]; FlushLexemeList: PROCEDURE [pH: ParseHandle] = INLINE {DiscardLexemeList[pH, RemoveLexemeList[pH]]}; RemoveLexemeList: PROCEDURE [pH: ParseHandle] RETURNS [head: Lexeme]; DiscardLexemeList: PROCEDURE [pH: ParseHandle, head: Lexeme]; AddLexeme: PROCEDURE [pH: ParseHandle, lex: Lexeme, where: Lexeme ← NIL]; DeleteLexeme: PROCEDURE [pH: ParseHandle, lex: Lexeme]; AppendSublistToString: PROCEDURE [pH: ParseHandle, s: STRING, first, last: Lexeme] RETURNS [nameType: MailParse.NameType]; -- Character Handling Utilities -- CharIndex: TYPE = CARDINAL; maxCharsPerBuffer: CARDINAL = 512 - 2 * SIZE[CharBufferHeader]; CharBuffer: TYPE = POINTER TO CharBufferContents; CharBufferHeader: TYPE = RECORD [ next, prev: CharBuffer, first: CharIndex, count: CARDINAL]; CharBufferContents: TYPE = RECORD [ header: CharBufferHeader, chars: PACKED ARRAY [0..maxCharsPerBuffer) OF CHARACTER]; EndOfInput: SIGNAL; Get: PROCEDURE [pH: ParseHandle] RETURNS [char: CHARACTER]; GetNaked: PROCEDURE [pH: ParseHandle] RETURNS [char: CHARACTER] = INLINE -- obtains next input character without any special interpretation. {RETURN[pH.nextChar[]]}; InitializeCharacterStorage: PROCEDURE [pH: ParseHandle]; FinalizeCharacterStorage: PROCEDURE [pH: ParseHandle]; ResetCharacterStorage: PROCEDURE [pH: ParseHandle] = INLINE {TruncateCharacterStorage[pH, 0]}; TruncateCharacterStorage: PROCEDURE [pH: ParseHandle, killFrom: CharIndex]; ReadFromStore: PROCEDURE [pH: ParseHandle, index: CharIndex] RETURNS [CHARACTER]; WriteToStore: PROCEDURE [pH: ParseHandle, char: CHARACTER]; GetPosition: PROCEDURE [pH: ParseHandle] RETURNS [CharIndex]; AddBuffer: PROCEDURE [pH: ParseHandle, first: CharIndex, prev: CharBuffer] RETURNS [CharBuffer]; LoadCache: PROCEDURE [pH: ParseHandle, index: CharIndex]; DeleteSuccessorBuffers: PROCEDURE [b: CharBuffer]; END.