* * * 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 Ibex line editor (for large files) putc putc Instructions: putc /l = list, /e = quit. putc To register changes in a line, you must ENTER it. putc (push with the cursor on the line) putc To insert lines, first ENTER the line above the point where putc you want to insert, then ENTER lines without line numbers. putc For help, type /? putc INF: putc putc Input file? getc file file = trm(file) if file = "/?" putc enter the name of the file you want to edit, or putc simply press if you want to create a new putc file. goto INF end 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 line{1,2} = "/?" perform help goto LNX 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 LNX: repeat end * * Case II: input file, or renumbered screen input * A: getc line AA: line = line // pad(nplace+2) breakflag = 0 * * /? Command * if line{1,2} = "/?" perform help goto A end * * /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 &dE~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 putc .b27 A.b27 &a15CEnter search string 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 putc .b27 A.b27 &a15CFirst enter search string, then enter replacement string 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 OPF: putc Output file? ($ = source file) getc file file = trm(file) if file = "/?" putc enter the name of the file to which you want the results putc stored. Enter a simple "$", if you want put the results putc stored back to the input file. putc goto OPF end 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 &dE~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 * procedure help putc The following commands can be given with zero, one, two line numbers. putc putc /l = list records from top Break = stop listing. putc /l,&dBm&d@ list record number m. /l,&dBm&d@,&dBn&d@ list records from m to n. putc /s = search for a string Break = stop search. putc /z = search for a string and replace it with another string. putc /d = delete lines (use with line numbers) putc /U = undelete lines (works as long as lines have not been renumber) putc /L = list lines, including deleted lines putc putc The following commands require the specific format shown. putc putc /c,&dBm&d@,&dBn&d@,a&dBp&d@ copy lines m to n below line p (a means "at") putc /m,&dBm&d@,&dBn&d@,a&dBp&d@ move lines m to n below line p (a means "at") putc putc The following commands take no arguments. putc putc /r = renumber lines (deleted lines will be lost) putc /e = quit putc putc To register changes in a line, you must ENTER it. putc (push with the cursor on the line) putc To insert lines, first ENTER the line above the point where putc you want to insert, then ENTER lines without line numbers. putc To delete a line, put a minus (-) just after the number and putc ENTER the line. return run