{ Macro to load a large text file into multiple windows } { and to save the file from those windows } { and to load macros from those windows } var workAroundPid: integer; begin requiresUser('TextBuf',1); end; {paste requires that there be an image window even if} {destination of paste is a text window} procedure workAround1; begin if nPics = 0 then begin saveState; setNewSize(32,32); makeNewWindow('WorkAroundPasteBug'); workAroundPid := pidNumber; restoreState; end; end; procedure workAround2; begin if pidExists(workAroundPid) then begin SelectPic(workAroundPid); Dispose; end; end; procedure myNewTextWindow(str: string); var prevWid: integer; begin prevWid := TxWidNumber; NewTextWindow(str); if prevWid = TxWidNumber then begin putMessage('myNewTextWindow failed'); exit; end; end; macro '{MacroW}Dispose Macro Windows'; var str: string; mwNum, mwid: integer; begin mwNum := GetMemo('nMacroWids'); while mwNum <> 0 do begin str := concat('MacroWid',mwNum:0); mwid := GetMemo(str); if TxWExists(mwid) then begin SelectTxW(mwid); Dispose; end; SetMemo(str,0); mwNum := mwNum - 1; SetMemo('nMacroWids',mwNum); end; end; procedure oneSearch; begin while (next > 0) and (next < 32000) do begin prev := next; next := SearchTxB(prev+1,32000-prev-1,str); end; next := prev + length(str); end; procedure nextLine; begin prev := next; next := SearchTxB(next,32000-next,chr(13)); if next = 0 then next := prev; end; procedure FindGoodSplitPoint; {output is in var len} var prev, next: integer; str: string; begin len := LengthTxB; if len > 32000 then begin {search for the last 'end;' at start of line before 32000 bytes} str := concat(chr(13),'end;'); next := 1; OneSearch; if next = 6 then begin str := concat(chr(13),chr(9),'end;'); next := 1; OneSearch; end; nextLine; if next < 20000 then begin {search for the last blank line before 32000} str := concat(chr(13),chr(13)); OneSearch; if next < 20000 then begin {search for last line before 32000} next := 32000; while (ord(FromTxB(next,1)) <> 13) and (next > 20000) do next := next - 1; end; end; len := next; end; end; macro '{MacroW}Read big text file into Macro Windows'; var mwNum, len: integer; begin if GetMemo('nMacroWids') <> 0 then begin PutMessage('Please dispose macro windows first'); exit; end; workAround1; MakeNewTxB; ReadAfterTxB(''); mwNum := 0; while LengthTxB > 0 do begin FindGoodSplitPoint; mwNum := mwNum + 1; myNewTextWindow(concat('Split Big Macros ',mwNum:0)); {Remember the window ID number and number of windows} SetMemo('nMacroWids',mwNum); SetMemo(concat('MacroWid',mwNum:0),TxWidNumber); CopyFromTxB(1,len); Paste; DeleteTxB(1,len); end; DisposeTxB; workAround2; end; procedure WindowsToTxB; var mwNum, mwid, len, n: integer; str: string; begin n := GetMemo('nMacroWids'); MakeNewTxb; WorkAround1; SelectPic(nPics); for mwNum := 1 to n do begin str := concat('MacroWid',mwNum:0); mwid := getMemo(str); if not TxWExists(mwid) then begin PutMessage('One of the macro windows has been closed'); WorkAround2; Exit; end; SelectTxW(mwid); SelectAll; Copy; PasteAfterTxB; end; WorkAround2; end; macro '{MacroW}Reload macros from windows'; {put /9 on end for command-9} var i: integer; begin showmessage('Reload macros from windows'); WindowsToTxB; MacrosFromTxB; end; macro '{MacroW}Save ImageMacros1..n'; var i: integer; begin showmessage('Reload macros from windows'); WindowsToTxB; WriteTxB('ImageMacrosOut'); {this ought to be a global string variable...} DisposeTxB; end; procedure ShowStats(msg: string); begin showMessage(msg, '\nTxBs = ',nTxBs:0, ' TxBNumber = ',TxBNumber:0, '/',TxBidNumber:0, ' LengthTxB = ',LengthTxB:0, '\nTxWs = ',nTxWs:0, ' TxWNumber = ',TxWNumber:0, '/',TxWidNumber:0, ' LengthTxW = ',LengthTxW:0 ); end; macro '{TxB}MakeNewTxB'; begin MakeNewTxB; ShowStats('MakeNewTxB'); end; macro '{TxB}NewTextWindow'; begin NewTextWindow('New Text Window'); ShowStats('NewTextWindow'); end; macro '{TxB}DisposeTxB'; begin DisposeTxB; ShowStats('DisposeTxB'); end; macro '{TxB}FromTxB'; var start, len: integer; begin start := 1; len := 10; start := getnumber('start',start); len := getnumber('len',len); ShowStats(concat('"',FromTxB(start,len),'"',Length(FromTxB(start,len)))); end; macro '{TxB}length FromTxB'; var start, len: integer; begin start := 1; len := 10; start := getnumber('start',start); len := getnumber('len',len); showStats(concat('Length(FromTxB(',start:0,',',len:0,')=',Length(FromTxB(start,len)))); end; macro '{TxB}AfterTxB'; var str: string; begin str := GetString('string to put after text buffer','default'); AfterTxB(str); showMessage( '\nTxBs = ',nTxBs,' TxBNumber = ',TxBNumber, ' LengthTxB = ',LengthTxB); end; macro '{TxB}TxB info'; begin showStats(''); end; macro '{TxB}SelectTxB'; var ask: integer; begin ask := getNumber('TxB number to select',1); if TxBExists(ask) then SelectTxB(ask); ShowStats(concat('SelectTxB: ',ask)); end; macro '{TxB}Delete'; var start, len: integer; str: string; begin start := 1; len := 10; start := getnumber('start',start); len := getnumber('len',len); str := getString('string to delete from','default'); delete(str,start,len); showMessage(str); end; macro '{TxB}DeleteTxB'; var start, len: integer; begin start := 1; len := lengthTxB; start := getnumber('start',start); len := getnumber('len',len); deleteTxB(start,len); ShowStats(concat('deleteTxB(',start:0,',',len:0,')')); end; macro '{TxB}Show TxB contents'; var start, len: integer; begin start := 1; len := lengthTxB; start := getnumber('start',start); len := getnumber('len',len); showMessage('"',FromTxB(start,len),'"'); end; macro '{TxB}CopyFromTxB'; var start, len: integer; begin start := 1; len := 10; start := getnumber('start',start); len := getnumber('len',len); CopyFromTxB(start,len); end; macro '{TxB}PasteAfterTxB'; begin PasteAfterTxB; showStats('PasteAfterTxB'); end; macro '{TxB}ReadAfterTxB'; begin ReadAfterTxB(''); showStats('ReadAfterTxB'); end; macro '{TxB}WriteTxB'; begin WriteTxB('writeTxB'); showStats('WriteTxB'); end; macro '{TxB}LoadMacrosFromTxB'; begin MacrosFromTxB; end; macro '{TxB}MakeTxWSelection'; var start, len: integer; begin start := 1; len := lengthTxW; start := getnumber('start',start); len := getnumber('len',len); MakeTxWSelection(start,len); end; macro '{MacroCmds}close'; begin close; end; macro '{MacroCmds}clear'; begin clear; end; macro '{MacroCmds}dispose'; begin dispose; end; macro '{MacroCmds}dispose all'; begin disposeAll; end; macro '{MacroCmds}selectall'; begin selectall; end; macro '{MacroCmds}copy'; begin copy; end; macro '{MacroCmds}paste'; begin paste; end; macro '{MacroCmds}selectWindow w1 and copy'; begin selectWindow('w1'); copy; end; macro '{MacroCmds}selectWindow w2 and copy'; begin selectWindow('w2'); copy; end; macro '{M¥1¥}macro1[1]'; begin putmessage('macro 1'); end; macro '{M¥2¥}macro2[2]'; begin putmessage('macro 2'); end; macro '{M¥1¥}macro3[3]'; begin putmessage('macro 3'); end; macro '{TxB}Tabulate sizes'; var outTxW, i, id, len: integer; str: string; begin outTxW := TxWidNumber; NewTextWindow('Tabulate sizes'); if outTxW = TxWidNumber then exit; {failed to open should exit macro} outTxW := TxWidNumber; for i := 1 to nTxWs do begin SelectTxW(i); id := TxWidNumber; len := LengthTxW; str := WindowTitle; SelectTxW(outTxW); WriteLn('TxW ',i:0,' TxWid ',id:0,' Length ',len:0,' "',str,'"'); end; for i := 1 to nTxBs do begin SelectTxB(i); id := TxBidNumber; len := LengthTxB; SelectTxW(outTxW); WriteLn('TxB ',i:0,' TxBid ',id:0,' Length ',len:0); end; end; macro '{TxB}Search TxB'; var start, len, result: integer; str: string; begin str := getString('search string','x'); start := 1; len := LengthTxB; start := getnumber('start',start); len := getnumber('len',len); result := SearchTxB(start, len, str); ShowStats(concat('Search TxB(',start:0,',',len:0,'"',str,'") = ', result)); end; macro '{TxB}Search TxW'; var start, len, result: integer; str: string; begin str := getString('search string','x'); start := 1; len := LengthTxW; start := getnumber('start',start); len := getnumber('len',len); result := SearchTxW(start, len, str); ShowStats(concat('Search TxW(',start:0,',',len:0,'"',str,'") = ', result)); end;