* * * Ibex Version of QED program * version 1.0 (09-20-92) * * str rec.1000,file.90,line.1000,line2.1000,out.1000,out2.1000,savefile.90 str moveup.6,formbuf.10000 str num.6,red.4,temp.10 int index(200000,2),addindex(1000,2),tindex(200000,2),x4 int a,b,c,d,e,f,g,h,i,j,k,n int qpoint,inflag,filesize,ppdsize,lastline int breakflag,addsize,nplace table X(200000) * nplace = 5 breakflag = 0 red = chr(27) // "&dA" moveup = chr(27) // "&a-1R" putc Input file? getc file file = trm(file) savefile = file if file = "" putc No input file. inflag = 1 qpoint = 0 else open [1,1] file inflag = 0 loop for i = 1 to 200000 if breakflag = 1 stop end getf [1] rec tput [X,i] ~rec index(i,1) = i index(i,2) = 0 repeat putc File exceeds 200000 records stop eof1: qpoint = i - 1 close [1] if qpoint > 99999 nplace = 6 end putc ~qpoint records. end filesize = qpoint * * X table has been constructed; inflag is set; index is constructed * * * Case I: no input file * if inflag = 1 loop getc line line = line // pad(2) if line{1,2} = "/r" perform renumber goto A end if line{1,2} = "/e" goto ST end if addsize = 0 x4 = 1 else addindex(addsize,2) = addsize + 1 end ++addsize ++qpoint addindex(addsize,1) = qpoint addindex(addsize,2) = 0 tput [X,qpoint] ~line repeat end * * Case II: input file, or renumbered screen input * A: getc line AA: line = line // pad(nplace+2) breakflag = 0 * * /e Command * if line{1,2} = "/e" goto ST end * * /l Command * if line{1,2} = "/l" perform getlistpar if a = 0 temp = "000000"{1,nplace} putc ~temp ******** File Listing ******** if x4 > 0 c = x4 perform listaddlines end a = 1 end loop for k = a to b if breakflag = 1 goto A end i = index(k,1) if i > 0 tget [X,i] rec n = k perform makenum putc ~num ~rec end c = index(k,2) if c > 0 perform listaddlines end repeat goto A end * * /d Command * if line{1,2} = "/d" perform getlistpar if a = 0 a = 1 if b = 0 goto A end end loop for k = a to b i = index(k,1) if i > 0 index(k,1) = 0 - i end repeat goto A end * * /U Command * if line{1,2} = "/U" perform getlistpar if a = 0 a = 1 if b = 0 goto A end end loop for k = a to b i = index(k,1) if i < 0 index(k,1) = 0 - i end c = index(k,2) if c > 0 UC: i = addindex(c,1) if i < 0 addindex(c,1) = 0 - i end c = addindex(c,2) if c > 0 goto UC end end repeat goto A end * * /L Command * if line{1,2} = "/L" perform getlistpar if a = 0 temp = "000000"{1,nplace} putc ~temp ******** File Listing ******** if x4 > 0 c = x4 perform listaddlines end a = 1 end loop for k = a to b if breakflag = 1 goto A end i = index(k,1) n = k perform makenum if i > 0 tget [X,i] rec putc ~num ~rec else i = 0 - i tget [X,i] rec putc ~num ~rec end c = index(k,2) if c > 0 perform Listaddlines end repeat goto A end * * /s Command * if line{1,2} = "/s" perform getlistpar getc line if a = 0 if x4 > 0 c = x4 perform schaddlines end a = 1 end loop for k = a to b if breakflag = 1 goto A end i = index(k,1) if i > 0 tget [X,i] rec if rec con line n = k perform makenum putc ~num ~rec end end c = index(k,2) if c > 0 perform schaddlines end repeat goto A end * * /z Command * if line{1,2} = "/z" perform getlistpar getc line getc line2 if a = 0 if x4 > 0 c = x4 perform zaddlines end a = 1 end loop for k = a to b if breakflag = 1 goto A end i = index(k,1) if i > 0 tget [X,i] rec f = len(line) j = len(rec) if rec con line out = rec{1,mpt-1} g = mpt + f if g > j rec = "" else rec = rec{g..} j = len(rec) end n = k perform makenum putc ~num ~out ~line2 ... ZZ: if j > 0 if rec con line out = rec{1,mpt-1} g = mpt + f if g > j rec = "" else rec = rec{g..} j = len(rec) end putc ~out ~line2 ... goto ZZ end end putc ~rec end end c = index(k,2) if c > 0 perform zaddlines end repeat goto A end * * /r Command * if line{1,2} = "/r" perform renumber goto A end * * /c Command * if line{1,2} = "/c" perform getplace perform getlistpar perform copylines goto A end if line{1,2} = "/m" perform getplace perform getlistpar perform copylines line = "/d," // chs(a) // "," // chs(b) goto AA end * * /f Command * if line{1,2} = "/f" formbuf = "" perform getlistpar if a = 0 goto BP end * Construct formbuf loop for k = a to b i = index(k,1) if i > 0 tget [X,i] rec rec = trm(rec) if rec <> "" if rec{..} = "." rec = rec // " " end formbuf = formbuf // rec // " " end end c = index(k,2) FFA: if c > 0 i = addindex(c,1) if i > 0 tget [X,i] rec rec = trm(rec) if rec <> "" if rec{..} = "." rec = rec // " " end formbuf = formbuf // rec // " " end end c = addindex(c,2) goto FFA end repeat * Determine where to add lines h = a - 1 if index(h,2) = 0 g = 0 else g = 1 c = index(h,2) FFD: h = c c = addindex(c,2) if c > 0 goto FFD end end * if g = 0, modify index(h,2) * if g = 1, modify addindex(h,2) * * Incertion loop (FFB) * FFB: if len(formbuf) < 69 line = formbuf formbuf = "" else if len(formbuf) > 80 line = formbuf{1,80} else line = formbuf end FFC: if formbuf con " " if mpt < 68 formbuf{mpt} = chr(0) i = mpt goto FFC else line = line{1,i-1} line = trm(line) e = len(line) * Deal with situation where line ends with a period if line{e} = "." and len(line) > 40 FFE: if formbuf{e} <> chr(0) --e if e > 0 goto FFE end end if e > 0 i = e line = line{1,i-1} end end * Reset and fix formbuf formbuf = formbuf{i+1..} FFG: if formbuf con chr(0) formbuf{mpt} = " " goto FFG end FFF: if formbuf{1} = " " formbuf = formbuf{2..} goto FFF end * end end end * Incert line ++qpoint tput [X,qpoint] ~line if g = 0 g = 1 if h = 0 x4 = addsize + 1 else index(h,2) = addsize + 1 end else addindex(addsize,2) = addsize + 1 end ++addsize addindex(addsize,1) = qpoint addindex(addsize,2) = 0 * Test for termination if formbuf = "" line = "/d," // chs(a) // "," // chs(b) goto AA else goto FFB end end /* Entering a line? if line{1,nplace} in ['0'..'9'] a = int(line{1,nplace}) if a = 0 lastline = 0 goto A end if a > filesize goto BP end i = index(a,1) if i < 0 goto BP end if line{nplace+1} = "-" index(a,1) = 0 - i goto A end if line{nplace+1} <> " " goto BP end line = line{nplace+2..} if line con red out2 = line{1,mpt-1} line = line{mpt+4..} putc .b27 L... putc ~moveup ... putc .b27 &a6C.b27 K~out2 putc ~line else tput [X,i] ~line end lastline = a goto A end if line{1} = "." if line{nplace+1} <> " " goto BP end a = 0 if line{2} = "." if line{3} = "." if line{4} = "." if line{5} = "." and nplace = 6 if line{6} in ['1'..'9'] a = int(line{6}) end end if line{5..nplace} in ['1'..'9'] a = int(line{5..nplace}) end else if line{4..nplace} in ['1'..'9'] a = int(line{4..nplace}) end end else if line{3..nplace} in ['1'..'9'] a = int(line{3..nplace}) end end else if line{2..nplace} in ['1'..'9'] a = int(line{2..nplace}) end end if a = 0 goto BP end if a > addsize goto BP end i = addindex(a,1) if i < 0 goto BP end if line{nplace+1} = "-" addindex(a,1) = 0 - i goto A end line = line{nplace+2..} if line con red out2 = line{1,mpt-1} line = line{mpt+4..} putc .b27 L... putc ~moveup ... putc .b27 &a6C.b27 K~out2 putc ~line else tput [X,i] ~line end lastline = a + 200000 goto A end if line{1,nplace+1} = " " ++addsize ++qpoint addindex(addsize,1) = qpoint line = line{nplace+2..} tput [X,qpoint] ~line if lastline < 200000 if lastline = 0 addindex(addsize,2) = x4 x4 = addsize else addindex(addsize,2) = index(lastline,2) index(lastline,2) = addsize end else lastline = lastline - 200000 addindex(addsize,2) = addindex(lastline,2) addindex(lastline,2) = addsize end lastline = addsize + 200000 putc ~moveup ... n = addsize perform makedotnum putc ~num goto A end * BP: putc .b7 ... goto A * ST: perform renumber if filesize = 0 putc Nothing in, nothing out. stop end putc Output file? ($ = source file) getc file file = trm(file) if file = "$" file = savefile end open [1,2] file loop for i = 1 to filesize j = index(i,1) tget [X,j] line putf [1] ~line repeat stop * trap: putc .b7 ... goto A * * * PROCEDURES * *P0: break * * procedure break breakflag = 1 return * *P1: getlistpar * * Purpose: get line numbers for /l, /d, /s, /z * * Input: line * * Output: a = first number, b = second number * procedure getlistpar line = line{4..} if line{1} in ['0'..'9',' ','e'] else return 1 end if line{1} = "e" a = filesize b = filesize return end if line{1} = " " a = 1 b = filesize else a = int(line) if a > filesize return 1 end if line con "," line = line // " " line = line{mpt+1..} if line{1} = " " b = a else if line{1} = "e" b = filesize else b = int(line) end end if b > filesize return 1 end else b = a end end if b < a return 1 end return * *P2: listaddlines * * Purpose: list added lines from point c in add-buffer * * Input: c = pointer to first added line * procedure listaddlines PLA: if breakflag = 1 return end i = addindex(c,1) if i > 0 tget [X,i] rec n = c perform makedotnum putc ~num ~rec end c = addindex(c,2) if c > 0 goto PLA end return * *P3: Listaddlines * * Purpose: same as listaddlines, but include deleted lines * procedure Listaddlines PLB: if breakflag = 1 return end i = addindex(c,1) n = c perform makedotnum if i > 0 tget [X,i] rec putc ~num ~rec else i = 0 - i tget [X,i] rec putc ~num ~rec end c = addindex(c,2) if c > 0 goto PLB end return * *P4: schaddlines * * Purpose: search added lines from point c for string * contained in line * procedure schaddlines PS: if breakflag = 1 return end i = addindex(c,1) if i > 0 tget [X,i] rec if rec con line n = c perform makedotnum putc ~num ~rec end end c = addindex(c,2) if c > 0 goto PS end return * *P5: zaddlines * * Purpose: search for line and substitute line2 in addline buffer * procedure zaddlines PZ: if breakflag = 1 return end i = addindex(c,1) if i > 0 tget [X,i] rec f = len(line) j = len(line) if rec con line out = rec{1,mpt-1} g = mpt + f if g > j rec = "" else rec = rec{g..} j = len(rec) end n = c perform makedotnum putc ~num ~out ~line2 ... PZ2: if j > 0 if rec con line out = rec{1,mpt-1} g = mpt + f if g > j rec = "" else rec = rec{g..} j = len(rec) end putc ~out ~line2 ... goto PZ2 end end putc ~rec end end c = addindex(c,2) if c > 0 goto PZ end return * *P6: renumber * * Purpose: renumber lines; eliminate deleted lines; clear addindex * procedure renumber if filesize > 0 loop for i = 1 to filesize tindex(i,1) = index(i,1) tindex(i,2) = index(i,2) repeat end k = 0 if x4 > 0 c = x4 perform addnewlines end if filesize > 0 loop for i = 1 to filesize if tindex(i,1) > 0 k = k + 1 index(k,1) = tindex(i,1) index(k,2) = 0 end c = tindex(i,2) if c > 0 perform addnewlines end repeat end filesize = k addsize = 0 x4 = 0 return * *P7: addnewlines * * Purpose: add new lines from add-buffer starting at point c * increment k * procedure addnewlines PAD: if addindex(c,1) > 0 k = k + 1 index(k,1) = addindex(c,1) index(k,2) = 0 end c = addindex(c,2) if c > 0 goto PAD end return * *P8: makenum * * Input: n * * Output: num * procedure makenum int i num = chs(n) i = len(num) num = "000000"{1,nplace-i} // num return *P9: makedotnum * * Input: n * * Output: num * procedure makedotnum int i num = chs(n) i = len(num) num = "......"{1,nplace-i} // num return * *P10: getplace * * Purpose: get location for move and copy commands * * Input: line * * Output: h = line after which material will be incerted * procedure getplace if line con "a" line2 = line CA: if mpt = len(line2) return 1 end line2 = line2{mpt+1..} if line2{1} = " " mpt = 1 goto CA end if line2{1} = "e" h = filesize else if line2{1} in ['0'..'9'] h = int(line2) else return 1 end end else return 1 end return * *P11: copylines * * Purpose: copy lines a through b (including incerts) after line h * don't change a or b * procedure copylines if h = 0 f = x4 else f = index(h,2) end g = 0 loop for k = a to b i = index(k,1) if i > 0 perform incert end c = index(k,2) KKA: if c > 0 i = addindex(c,1) if i > 0 perform incert end c = addindex(c,2) goto KKA end repeat return * *P12: incert * * Inputs: f may be index(h,2) * g = situation flag * h = main point of incertion * i = address in Q1 of record to incert * qpoint = address in Q1 of last incertion * addsize = last add-line number * procedure incert tget [X,i] rec j = len(rec) ++qpoint tput [X,qpoint] ~rec if g = 0 g = 1 if h = 0 x4 = addsize + 1 else index(h,2) = addsize + 1 end else f = addindex(addsize,2) addindex(addsize,2) = addsize + 1 end ++addsize addindex(addsize,1) = qpoint addindex(addsize,2) = f return * run