PACKET wordperfect conversion DEFINES convert to wp : LET type1 = 1, linefeed = 3, limit = 4, free = 5, page cmd0 = 6, page cmd1 = 7, on = 8, off = 9, page nr = 10, pagelength = 11, start = 12, foot = 13, end = 14, head = 15, headeven = 16, headodd = 17, bottom = 18, bottomeven = 19, bottomodd = 20, block = 21, material = 22, columns = 23, columnsend = 24, ib0 = 25, ib1 = 26, ib2 = 27, ie0 = 28, ie1 = 29, ie2 = 30, topage = 31, goalpage = 32, count0 = 33, count1 = 34, setcount = 35, value0 = 36, value1 = 37, table = 38, table end = 39, r pos = 40, l pos = 41, c pos = 42, d pos = 43, b pos = 44, clear pos0 = 45, clear pos1 = 46, right = 47, center = 48, skip = 49, skip end = 50, u cmd = 51, d cmd = 52, e cmd = 53, head on = 54, head off = 55, bottom on = 56, bottom off = 57, count per page=58, fillchar = 59, mark cmd = 60, mark end = 61, pageblock = 62, bsp = 63, counter1 = 64, counter2 = 65, setcounter = 66, putcounter0 = 67, putcounter1 = 68, storecounter = 69, ub = 70, ue = 71, fb = 72, fe = 73, region = 74, region end = 75; LET eumel line display pos = 1, dos line display pos = 10, default tab insert pos = 21; LET cont paper width = 20.88, cont paper length = 30.48, minimal margin = 0.5; LET eumel modifications = "ibur"; LET wp cmd start = "<|", wp cmd end = "|>"; ROW 6 TEXT VAR wp types on off := ROW 6 TEXT : ("p\K13", "p\K14", "", "p\K15", "p\K16", "p\K17"); ROW 4 TEXT CONST wp mods on off := ROW 4 TEXT : ("p\K24", "p\%", "p\'", "p\K28"); ROW 2 TEXT CONST wp scripts on off := ROW 2 TEXT : ("p\K11", "p\K12"); TEXT VAR cosmetic cmds := "type:1.1linefeed:3.1limit:4.1free:5.1page:6.01on:8.1off:9.1pagenr:10.2 pagelength:11.1start:12.2foot:13.0end:14.0head:15.0headeven:16.0 headodd:17.0bottom:18.0bottomeven:19.0bottomodd:20.0block:21.0"; cosmetic cmds CAT "material:22.1columns:23.2columnsend:24.0ib:25.012ie:28.012topage:31.1 goalpage:32.1count:33.01setcount:35.1value:36.01table:38.0tableend:39.0 rpos:40.1lpos:41.1cpos:42.1dpos:43.2bpos:44.2clearpos:45.01right:47.0"; cosmetic cmds CAT "center:48.0skip:49.0skipend:50.0u:51.0d:52.0e:53.0headon:54.0headoff:55.0 bottomon:56.0bottomoff:57.0countperpage:58.0fillchar:59.1mark:60.2 markend:61.0pageblock:62.0b:63.0counter:64.12setcounter:66.2putcounter:67.01 storecounter:69.1"; cosmetic cmds CAT "ub:70.0ue:71.0fb:72.0fe:73.0region:74.0regionend:75.0"; TEXT VAR font number string, users tabs cmd, no users tabs cmd, param1, param2, act l, next l, dos l, eumel chunk, wp cmd, buffer, index buffer, paired move cmd; TEXT CONST wp enter tab menu := wp cmd start + "s\318", wp clear tabs := "0\\rt\\ri\\el", wp quit tab menu := "\&00" + wp cmd end, wp return := "\\rt", global tabs cmd := wp enter tab menu + wp clear tabs + "0,0.5c" + wp return + wp quit tab menu, page no cmd := wp cmd start + "s\3263" + wp cmd end; INT VAR cmd index, no of params, base font index, base font offset, current wp size, current script value, mod flags, current index number, act l no, dos l length, first cross pos, second cross pos, act text start, next text start, act indent level, next indent level, current tab insert pos, current font, cursor x, cursor y; REAL VAR paper width, paper length, current top margin, current bottom margin, current left margin, current right margin, current limit, current pagelength, current indent pitch; BOOL VAR in footnote, in table, in index, in header, in bottom, in enum, is last line of paragraph, text in dos l, line contains number sign ; PROC convert to wp (TEXT CONST eumel file name) : TEXT VAR wp file name, file fonttable, users fonttable := ""; BOOL VAR errors found := FALSE; IF word wrap (eumel file name) THEN ELSE refuse nonwrapped file FI; IF NOT errors found THEN line; say ("Schrifttypen werden analysiert ..."); analyze fonts (eumel file name, file fonttable, font number string, base font index); line; say ("Fu"251"noten werden plaziert ..."); move footnotes (eumel file name); wp file name := dos file name (eumel file name, "wpf"); forget (wp file name, quiet); line; say ("Datei wird konvertiert ..."); line; IF file fonttable <> "" THEN users fonttable := fonttable; fonttable (file fonttable) FI; convert to wp file (eumel file name, wp file name); forget (eumel file name, quiet); rename (eumel file name + ".orig", eumel file name); IF users fonttable <> "" THEN fonttable (users fonttable) FI FI END PROC convert to wp; PROC convert to wp (THESAURUS CONST th) : do (PROC (TEXT CONST) convert to wp, th) END PROC convert to wp; PROC convert to wp : convert to wp (std) END PROC convert to wp; PROC move footnotes (TEXT CONST file name) : copy (file name, file name + ".orig"); FILE VAR f := sequential file (modify, file name); INT VAR count line no, count col no, foot line no, foot col no, end line no, end col no, value line no, value col no, footnote lines, line length; TEXT VAR count line tail; toline (f, 1); WHILE NOT eof (f) REP cout (line no (f)); down (f, "#count#"); IF pattern found THEN process note FI PER . process note : count line no := line no (f); count col no := col (f); down (f, "#foot#"); IF pattern found THEN foot line no := line no (f); foot col no := col (f); IF foot line no - count line no > 20 THEN LEAVE process note FI; isolate foot cmd if necessary; down (f, "#end#"); IF pattern found THEN end line no := line no (f); check for value; isolate end cmd if necessary; remove note; split count line; replace count by note ELSE LEAVE process note FI ELSE LEAVE process note FI . check for value : toline (f, foot line no); col (f, foot col no); down (f, "#value#"); IF pattern found THEN value line no := line no (f); value col no := col (f); IF value line no >= end line no THEN LEAVE process note ELSE delete value cmd FI ELSE LEAVE process note FI; toline (f, end line no) . delete value cmd : read record (f, act l); change (act l, "#u##value##e#", ""); change (act l, "#value#", ""); write record (f, act l) . isolate foot cmd if necessary : read record (f, act l); IF foot col no > 1 THEN next l := subtext (act l, foot col no); IF (act l SUB (foot col no - 1)) = " " THEN act l := subtext (act l, 1, foot col no - 2) ELSE act l := subtext (act l, 1, foot col no - 1) FI; write record (f, act l); down (f, 1); insert record (f); write record (f, next l) FI . isolate end cmd if necessary : read record (f, act l); end col no INCR 5; next l := subtext (act l, end col no); IF next l > " " THEN act l := subtext (act l, 1, end col no - 1); write record (f, act l); down (f, 1); insert record (f); write record (f, next l); up (f, 1) FI . remove note : footnote lines := end line no - foot line no + 1; remove (f, footnote lines) . split count line : toline (f, count line no); read record (f, act l); cmd start := pos (act l, "#u##count##e#", count col no - 3); IF cmd start = count col no - 3 THEN cmd end := cmd start + 12 ELSE cmd start := count col no; cmd end := cmd start + 7 FI; count line tail := subtext (act l, cmd end + 1); IF (count line tail SUB LENGTH count line tail) = " " CAND (only command line (count line tail) COR LENGTH count line tail = 1) THEN count line tail CAT " " FI; act l := subtext (act l, 1, cmd start - 1); write record (f, act l) . replace count by note : toline (f, count line no + 1); reinsert (f); append count line tail; toline (f, count line no + 1); read record (f, next l); delete record (f); up (f, 1); read record (f, act l); act l CAT next l; line length := LENGTH act l; IF pos (act l, "#foot#") = line length - 6 CAND (act l SUB line length) = " " THEN act l := subtext (act l, 1, line length - 1) FI; write record (f, act l) . append count line tail : read record (f, act l); end col no := pos (act l, "#end#"); act l := subtext (act l, 1, end col no + 4); IF count line tail <> "" THEN act l CAT count line tail ELSE append next line FI; write record (f, act l) . append next line : down (f, 1); read record (f, next l); IF next l > " " THEN delete record (f); up (f, 1); act l CAT " "; act l CAT next l; write record (f, act l) ELSE up (f, 1) FI . cmd start : first cross pos . cmd end : second cross pos END PROC move footnotes; PROC initialize values : act l no := 0; current wp size := 3; current script value := 0; mod flags := 0; current index number := 0; current tab insert pos:= default tab insert pos; paper length := cont paper length; paper width := cont paper width; current top margin := 2.5; current bottom margin := 2.5; current left margin := 3.0; current right margin := 2.0; current pagelength := paper length - current top margin - current bottom margin; current limit := paper width - current left margin - current right margin; current font := 1; current indent pitch := xstep conversion (indentation pitch (current font)); in enum := FALSE; in table := FALSE; in footnote := FALSE; in header := FALSE; in bottom := FALSE; in index := FALSE; text in dos l := FALSE; base font offset := base font index - 3; wp cmd := ""; dos l := ""; dos l length := 0; next indent level := 0; no users tabs cmd := no users tabs command; users tabs cmd := no users tabs cmd END PROC initialize values; TEXT PROC no users tabs command : TEXT VAR t := wp enter tab menu; t CAT wp clear tabs; t CAT text (current limit - 2.0); t CAT ",0.2c\\rt"; t CAT wp quit tab menu; t END PROC no users tabs command; INT PROC indent level (INT CONST text start pos) : LET tab distance = 0.5; IF text start pos < 3 THEN 0 ELSE positive indent level FI . positive indent level : REAL VAR left margin distance := real (text start pos - 1) * current indent pitch; INT VAR ind level := int (round (left margin distance / tab distance, 0)); IF ind level = 0 THEN 1 ELSE ind level FI END PROC indent level; PROC convert to wp file (TEXT CONST eumel file name, wp file name) : get cursor (cursor x, cursor y); FILE VAR eumel f := sequential file (input, eumel file name), dos f := sequential file (output, wp file name); max line length (dos f, max text length); INT CONST file lines := lines (eumel f); BOOL VAR is last file line := FALSE; set file defaults; getline (eumel f, next l); next text start := pos (next l, ""33"", ""255"", 1); REP act l := next l; act l no INCR 1; cursor (eumel line display pos, cursor y); cout (act l no); act text start := next text start; IF act l no >= file lines THEN next l := ""; next text start := 1; is last file line := TRUE ELSE getline (eumel f, next l); get next text start FI; act indent level := next indent level; next indent level := indent level (next text start); process act line; IF is last line of paragraph THEN IF is last file line THEN complement pending paired commands FI; putline (dos f, dos l); dos l := ""; dos l length := 0; text in dos l := FALSE; cursor (dos line display pos, cursor y); cout (line no (dos f)) FI UNTIL act l no >= file lines PER END PROC convert to wp file; PROC set file defaults : initialize values; set endnote options; no pagination; wp cmd CAT global tabs cmd . set endnote options : cat to wp command ("s\J243\J22\\rt\&") . no pagination : cat to wp command ("s\32649\&") END PROC set file defaults; PROC get next text start : next text start := pos (next l, ""33"", ""255"", 1); IF next text start = 2 THEN next text start := 1 FI END PROC get next text start; PROC process act line : LET tab code = "<|s\\tb|>", indent code = "<|s\\in|>", margin rel code = "<|s\^|>"; INT VAR enum blanks, past enumerator pos; trim end of line (act l, is last line of paragraph, in table); replace eumel special characters (act l, line contains number sign); trim start of line; IF in table CAND NOT text in dos l THEN replace multiple blanks by tab stops (act l, tab code) FI; transfer line in chunks . trim start of line : IF NOT (text in dos l COR only command line (act l)) THEN IF NOT is last line of paragraph CAND next indent level < act indent level THEN cat to dos l (next indent level * indent code); cat to dos l ((act indent level - next indent level) * tab code) ELSE cat to dos l (act indent level * indent code) FI; enum blanks := enumeration offset (act l, next l, in enum, act text start); IF enum blanks <> 0 THEN in enum := TRUE; past enumerator pos := pos (act l, " ", act text start); change (act l, past enumerator pos, enum blanks, indent code) ELSE in enum := FALSE; IF NOT is last line of paragraph CAND next indent level > act indent level THEN cat to dos l (indent code); cat to dos l (margin rel code) FI FI FI END PROC process act line; PROC complement pending paired commands : reset modifications; IF current wp size <> 3 THEN cat to wp command (wp types on off [current wp size]); cat to dos l (wp cmd) FI; END PROC complement pending paired commands; PROC transfer line in chunks : WHILE act text start <= LENGTH act l REP next text command pos (act l, act text start, first cross pos, second cross pos); IF first cross pos <> 0 THEN IF first cross pos <> act text start THEN process text chunk (act text start, first cross pos - 1) FI; process eumel command (first cross pos, second cross pos); act text start := second cross pos + 1 ELSE process text chunk (act text start, LENGTH act l); LEAVE transfer line in chunks FI; PER END PROC transfer line in chunks; PROC process text chunk (INT CONST start pos, end pos) : eumel chunk := subtext (act l, start pos, end pos); IF in header COR in bottom THEN change all (eumel chunk, "%", page no cmd) FI; IF line contains number sign THEN change all (eumel chunk, ""222"", "#") FI; cat to dos l (eumel chunk); text in dos l := TRUE; IF in index THEN index buffer CAT eumel chunk FI END PROC process text chunk; PROC process eumel command (INT CONST start pos, end pos) : eumel chunk := subtext (act l, start pos + 1, end pos - 1); IF (eumel chunk SUB 1) = "-" THEN process comment (eumel chunk) ELSE process command FI; cat to dos l (wp cmd); wp cmd := "" . process command : analyze command (cosmetic cmds, eumel chunk, 3, cmd index, no of params, param1, param2); customized command processing; IF in index THEN index buffer CAT wp cmd FI . customized command processing : SELECT cmd index OF CASE type1 : process type cmd (param1) CASE linefeed : cat to wp command ("s\316" + param1 + "\\rt\&") CASE limit : process limit (param1) CASE free : process free (param1) CASE page cmd0 : cat to wp command ("s\_") CASE page cmd1 : cat to wp command ("s\_\3261" + param1 + "\\rt\&") CASE on : process mod on (param1) CASE off : process mod off (param1) CASE page nr : CASE pagelength : process pagelength (param1) CASE start : process start (param1, param2) CASE foot : process footnote CASE end : process end CASE head, headeven, headodd : process head (cmd index) CASE bottom, bottomeven, bottomodd : process bottom (cmd index) CASE block : cat to wp command ("s\3134\&") CASE material : CASE columns : process columns CASE columnsend : cat to wp command ("s\>12") CASE ib0, ib1, ib2 : process index on (param1, param2) CASE ie0, ie1, ie2 : process index off (param 1) CASE topage : cat to wp command ("s\<111" + param1 + wp return) CASE goalpage : cat to wp command ("s\<12" + param1 + wp return) CASE count0 : cat to wp command ("s\051\\rt") CASE count1 : process reference target (param1) CASE setcount : cat to wp command ("s\J13" + param1 + wp return) CASE value0 : CASE value1 : cat to wp command ("s\<114" + param1 + wp return) CASE table : process table CASE table end : process table end CASE r pos, l pos, c pos, d pos, b pos : process tab stop (eumel chunk SUB 1, param1) CASE clear pos0 : process clear all tabs CASE clear pos1 : process clear tab (param1) CASE right : cat to wp command ("s\=") CASE center : cat to wp command ("s\1") CASE skip : CASE skip end : CASE u cmd : process script cmd (1) CASE d cmd : process script cmd (2) CASE e cmd : process e cmd CASE head on : CASE head off : cat to wp command ("s\32311\&") CASE bottom on : CASE bottom off : cat to wp command ("s\32411\&") CASE count per page : cat to wp command ("s\J146y\&") CASE fillchar : CASE mark cmd : CASE mark end : CASE pageblock : CASE bsp : CASE counter1 : CASE counter2 : CASE setcounter : CASE putcounter0: CASE putcounter1: CASE storecounter: CASE ub : process mod on ("u") CASE ue : process mod off ("u") CASE fb : CASE fe : CASE region, region end : cat to wp command ("p\3y") END SELECT END PROC process eumel command; PROC process comment (TEXT CONST t) : buffer := "p\Hy"; cat to wp command (buffer); wp cmd CAT subtext (t, 2); cat to wp command (buffer) END PROC process comment; PROC cat to dos l (TEXT CONST t) : LET mtl = 32000; INT CONST t length := LENGTH t; IF mtl - t length < dos l length THEN report ("Absatz ist zu lang") ELSE dos l CAT t; dos l length INCR t length FI END PROC cat to dos l; PROC cat to wp command (TEXT CONST t) : IF t <> "" THEN wp cmd CAT wp cmd start; wp cmd CAT t; wp cmd CAT wp cmd end FI END PROC cat to wp command; PROC process mod on (TEXT CONST kind of mod) : TEXT CONST mod char := kind of mod SUB 1; INT CONST mod no := pos (eumel modifications, mod char); cat to wp command (wp mods on off [mod no]); set bit (mod flags, mod no) END PROC process mod on; PROC process mod off (TEXT CONST kind of mod) : TEXT CONST mod char := kind of mod SUB 1; INT CONST mod no := pos (eumel modifications, mod char); process mod off (mod no) END PROC process mod off; PROC process mod off (INT CONST mod no) : cat to wp command (wp mods on off [mod no]); reset bit (mod flags, mod no) END PROC process mod off; PROC reset modifications : INT VAR mod no; IF mod flags > 0 THEN FOR mod no FROM 1 UPTO 4 REP IF bit (mod flags, mod no) THEN process mod off (mod no) FI PER FI END PROC reset modifications; PROC process type cmd (TEXT CONST wanted type) : reset modifications; current wp size off; process type change (wanted type) . current wp size off : cat to wp command (wp types on off [current wp size]) END PROC process type cmd; PROC process type change (TEXT CONST eumel type) : current font := font (eumel type); current indent pitch := xstep conversion (indentation pitch (current font)); TEXT CONST eumel type no := code (current font); INT CONST eumel size := pos (font number string, eumel type no); current wp size := eumel size - base font offset; IF current wp size < 1 THEN current wp size := 1 ELIF current wp size > 6 THEN current wp size := 6 FI; cat to wp command (wp types on off [current wp size]) END PROC process type change; PROC process script cmd (INT CONST script value) : current script value := script value; cat to wp command (wp scripts on off [script value]) END PROC process script cmd; PROC process e cmd : cat to wp command (wp scripts on off [current script value]); current script value := 0 END PROC process e cmd; PROC process free (TEXT CONST cm) : IF NOT in header COR in bottom THEN buffer := "s\3412"; buffer CAT cm; buffer CAT "c\\rt\&"; cat to wp command (buffer) FI END PROC process free; PROC process limit (TEXT CONST t limit) : current limit := real (t limit); current limit := min (current limit, paper width - 2.0 * minimal margin); process horizontal margins END PROC process limit; PROC process horizontal margins : current right margin := paper width - current limit - current left margin; IF current right margin - minimal margin < 0.0 THEN current right margin := minimal margin; current left margin := paper width - current limit - current right margin FI; wp cmd := wp cmd start; wp cmd CAT "s\317"; wp cmd CAT text (current left margin); wp cmd CAT "c\\rt"; wp cmd CAT text (current right margin); wp cmd CAT "c\\rt\&"; wp cmd CAT wp cmd end; END PROC process horizontal margins; PROC process pagelength (TEXT CONST t length) : current pagelength := real (t length); current pagelength := min (current pagelength, paper length - 2.0 * minimal margin); process vertical margins END PROC process pagelength; PROC process vertical margins : current bottom margin := paper length - current pagelength - current top margin; IF current bottom margin - minimal margin < 0.0 THEN current bottom margin := minimal margin; current top margin := paper length - current pagelength - current bottom margin FI; wp cmd := wp cmd start; wp cmd CAT "s\325"; wp cmd CAT text (current top margin); wp cmd CAT "c\\rt"; wp cmd CAT text (current bottom margin); wp cmd CAT "c\\rt\&"; wp cmd CAT wp cmd end; END PROC process vertical margins; PROC process start (TEXT CONST t x, t y) : current left margin := real (t x); process horizontal margins; current top margin := real (t y); process vertical margins END PROC process start; PROC process footnote : IF in footnote THEN report ("Fu"251"notenschachtelung") FI; paired move cmd := "f\J11 \\rt\&"; cat to wp command (paired move cmd); in footnote := TRUE END PROC process footnote; PROC process head (INT CONST index) : IF in header THEN report ("Header-Schachtelung") FI; paired move cmd := "f\323"; IF index <= headeven THEN paired move cmd CAT "1"; IF index = head THEN paired move cmd CAT "2" ELSE paired move cmd CAT "4" FI ELSE paired move cmd CAT "23" FI; paired move cmd CAT "\\rt\&00"; cat to wp command (paired move cmd); in header := TRUE END PROC process head; PROC process bottom (INT CONST index) : IF in bottom THEN report ("Bottom-Schachtelung") FI; paired move cmd := "f\324"; IF index <= bottomeven THEN paired move cmd CAT "1"; IF index = bottom THEN paired move cmd CAT "2" ELSE paired move cmd CAT "4" FI ELSE paired move cmd CAT "23" FI; paired move cmd CAT "\\rt\&00"; cat to wp command (paired move cmd); in bottom := TRUE END PROC process bottom; PROC process end : reset types and mods; cat to wp command (paired move cmd); IF in header THEN in header := FALSE ELIF in bottom THEN in bottom := FALSE ELIF in footnote THEN in footnote := FALSE ELSE report ("Unmotivierte End-Anweisung") FI . reset types and mods : reset modifications; IF current wp size <> 3 THEN cat to wp command (wp types on off [current wp size]); current wp size := 3; FI END PROC process end; PROC process columns : INT VAR fcp, scp; cat to wp command ("s\>1301"); next text command pos (act l, act text start, fcp, scp); IF fcp = second cross pos + 1 THEN eumel chunk := subtext (act l, fcp + 1, scp - 1); analyze command (cosmetic cmds, eumel chunk, 3, cmd index, no of params, param1, param2); IF cmd index = limit THEN second cross pos := scp FI FI END PROC process columns; PROC process index on (TEXT CONST index number, registered text) : IF in index THEN report ("Kann Indexschachtelung nicht verarbeiten") FI; current index number := int (index number); index buffer := "<|s\<3"; IF registered text <> "" THEN index buffer CAT registered text ELSE in index := TRUE FI END PROC process index on; PROC process index off (TEXT CONST index number) : INT CONST index off number := int (index number); IF current index number = index off number THEN current index number := 0 ELSE report ("Kann Indexschachtelung nicht verarbeiten") FI; wp cmd := index buffer; wp cmd CAT "\\rt\ |>"; in index := FALSE END PROC process index off; PROC process reference target (TEXT CONST marker) : buffer := "s\J21\&\<12"; buffer CAT marker; buffer CAT wp return; cat to wp command (buffer) END PROC process reference target; PROC process table : IF users tabs cmd <> no users tabs cmd THEN wp cmd := users tabs cmd FI; in table := TRUE END PROC process table; PROC process table end : wp cmd := global tabs cmd; in table := FALSE END PROC process table end; PROC process tab stop (TEXT CONST tab type, tab pos) : buffer := tab pos; buffer CAT wp return; IF pos ("rcd", tab type) <> 0 THEN buffer CAT tab type FI; insert new tab stop; IF in table THEN wp cmd CAT users tabs cmd FI . insert new tab stop : insert char (users tabs cmd, buffer, current tab insert pos); current tab insert pos INCR LENGTH buffer END PROC process tab stop; PROC process clear all tabs : users tabs cmd := no users tabs cmd; current tab insert pos := default tab insert pos; END PROC process clear all tabs; PROC process clear tab (TEXT CONST tab pos) : INT VAR del start, del end; del start := pos (users tabs cmd, tab pos); IF del start <> 0 THEN clear pos FI . clear pos : del end := pos (users tabs cmd, wp return, del start) + 4; buffer := users tabs cmd SUB del end + 1; IF pos ("rcd", buffer) <> 0 THEN del end INCR 1 FI; change (users tabs cmd, del start, del end, ""); IF in table THEN wp cmd CAT users tabs cmd FI END PROC process clear tab; PROC report (TEXT CONST t) : errorstop ("Zeile " + text (act l no) + ": " + t) END PROC report; END PACKET wordperfect conversion;