-- File: WalnutRetrieveParseImpl.mesa -- Contents: Implementation of the parsing of text into MsgRecs -- Last edit by: -- Rick on: XXX -- Willie-Sue on: May 18, 1983 3:18 pm DIRECTORY GVMailParse, Rope, IO, WalnutLog USING [MsgRec], WalnutParse, WalnutRetrieve; WalnutRetrieveParseImpl: CEDAR PROGRAM IMPORTS GVMailParse, IO, Rope, WalnutParse EXPORTS WalnutRetrieve = BEGIN OPEN GVMailParse, WalnutParse; 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: 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: 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; 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: MessageFieldIndex IN MessageFieldIndex DO { mLF_ 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 œžœžœ/Īnœž œžœžœžœžœžœžœžœžœœŸœžœžœžœžœ žœžœ)žœžœ%žœ$žœžœŸœžœžœžœ žœžœžœžœ!žœžœ Ÿ œžœ&žœ žœžœžœGžœĩžœžœžœŸœžœžœžœžœžœžœžœ žœžœ(žœžœ žœ žœžœ!žœžœžœžœ žœžœžœ4žœ-žœ žœžœ œžœ žœžœPžœœžœžœžœ žœžœžœ.žœžœžœœ žœžœ žœĄž œžœžœžœžœ&žœœžœGœžœ,žœžœžœžœ˜Ô—…— Ö ą