-- File: WalnutRetrieveParseImpl.mesa -- Contents: Implementation of the parsing of text into MsgRecs -- Last edit by: -- Rick on: XXX -- Willie-Sue on: September 9, 1983 4:10 pm DIRECTORY GVMailParse USING [endOfInput, ParseError, ParseHandle, FinalizeParse, GetFieldBody, GetFieldName, InitializeParse], Rope, IO, WalnutLog USING [MsgRec], WalnutParse USING [MessageFieldIndex, MessageInfo, ParseStatus, messageParseArray], WalnutRetrieve; WalnutRetrieveParseImpl: CEDAR PROGRAM IMPORTS GVMailParse, IO, Rope, WalnutParse EXPORTS WalnutRetrieve = BEGIN OPEN GVMailParse; ROPE: TYPE = Rope.ROPE; -- turn the strm into records ParseMsgIntoFields: PUBLIC PROC[msg: WalnutLog.MsgRec, strm: IO.STREAM, msgLength: INT] RETURNS[s: WalnutParse.ParseStatus, sPos, mPos: INT] = BEGIN mLF: WalnutParse.MessageInfo; startPos: INT_ strm.GetIndex[]; lastCharPos: INT_ startPos + msgLength; NextChar: PROC[] RETURNS [ch: CHAR] = { IF mPos > lastCharPos THEN ch_ endOfInput ELSE ch_ strm.GetChar[ ! IO.EndOfStream => {ch_ endOfInput; CONTINUE}]; mPos_ mPos + 1; }; SimpleField: PROC[index: WalnutParse.MessageFieldIndex, fieldBody: ROPE] = BEGIN SELECT index FROM senderF => msg.inMsgSender_ fieldBody; replyToF, ccF, cF, bccF => NULL; fromF => msg.from_ fieldBody; dateF => msg.date_ fieldBody; subjectF => msg.subject_ fieldBody; inReplyToF => msg.inReplyTo_ fieldBody; toF => msg.to_ fieldBody; voiceF => msg.voiceID_ fieldBody; ENDCASE => ERROR; END; CategoriesField: PROC[fB: ROPE] RETURNS [LIST OF ROPE] = BEGIN end: INT_ fB.Length[]; p: INT_ Rope.SkipOver[fB, 0, " \n"]; r: ROPE; IF p # end THEN r_ Rope.Substr[fB, p, end-p+1] ELSE {r_ fB; p_ 0}; IF (p_ Rope.Find[fB, "',", p]) < 0 THEN RETURN[CONS[r, NIL]] ELSE RETURN[CONS[r, CategoriesField[Rope.Substr[r, p+1, end-p]]]]; END; pH: ParseHandle_ InitializeParse[]; BEGIN field: ROPE_ NIL; s_ ok; -- good status mPos_ startPos; DO found, fieldNotRecognized: BOOL_ TRUE; sPos_ mPos; [field, found]_ GetFieldName[pH, NextChar ! ParseError => GOTO parseErrorExit]; IF ~found THEN EXIT; FOR i: WalnutParse.MessageFieldIndex IN WalnutParse.MessageFieldIndex DO { mLF_ WalnutParse.messageParseArray[i]; IF Rope.Equal[mLF.name, field, FALSE] THEN -- ignore case { fieldNotRecognized_ FALSE; SELECT mLF.fType FROM simpleRope, rNameList => SimpleField[i, GetFieldBody[pH, NextChar]]; rCatList => msg.categoriesList_ CategoriesField[GetFieldBody[pH, NextChar]]; ENDCASE => ERROR; }; }; ENDLOOP; IF fieldNotRecognized THEN []_ GetFieldBody[pH, NextChar, TRUE]; -- anything not recognized ENDLOOP; -- leaves strm positioned at the beginning of the body of the message FinalizeParse[pH]; EXITS parseErrorExit => { FinalizeParse[pH]; RETURN[syntaxError, sPos, mPos]}; END; END; END. ĘŨ˜JšÜĪcwœœ.œĪk œžœqžœ žœžœWĪnœž œžœžœžœžœžœžœžœžœœŸœžœžœžœžœ žœžœ)žœžœ1žœ$žœžœŸœžœžœžœ žœžœžœžœ!žœžœ Ÿ œžœ2žœ žœžœžœGžœŲžœžœžœŸœžœžœžœžœžœžœžœ žœžœ(žœžœ žœ žœžœ!žœžœžœžœ žœžœžœ4žœ-žœ žœžœ œžœ žœžœPžœœžœžœžœ žœ"žœžœ:žœžœžœœ žœžœ žœĄž œžœžœžœžœ&žœœžœGœžœ,žœžœžœžœ˜Ú—…— Ü ŋ