home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 9
/
CD_ASCQ_09_1193.iso
/
news
/
557
/
anedit
/
ae5.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-03-24
|
47KB
|
1,188 lines
UNIT AE5 ;
{$R-}
{$B-}
{$I-}
{$S+}
{$V-}
INTERFACE
USES Crt, Dos, Printer, AE0, AE1, AE2, AE3, AE4 ;
PROCEDURE Initialize ;
PROCEDURE ShutOff ;
PROCEDURE ExecKey (KeyNr : WORD) ;
IMPLEMENTATION
{-----------------------------------------------------------------------------}
{ Initializes all necessary variables, and loads the file specified on the }
{ command line into the first workspace. }
{-----------------------------------------------------------------------------}
PROCEDURE Initialize ;
VAR Reg : REGISTERS ;
Counter : WORD ;
ConfigFile : FILE OF ConfigBlock ;
ConfigFilePath : PathStr ;
AEDir : DirStr ;
AEName : NameStr ;
AEExt : ExtStr ;
WorkFile : FILE OF WorkBlock ;
Work : WorkBlock ;
ValidConfig : boolean ;
BEGIN
CLRSCR ;
ProgramFinished := FALSE ;
{$IFDEF DEVELOP }
MinMemAvail := MEMAVAIL ;
InitMemAvail := MEMAVAIL ;
{$ENDIF }
{ check the presence of a color video adapter }
Reg.AH := 15 ;
INTR ($10, Reg) ;
ColorCard := Reg.AL <> Mono ;
{ set start address of screen memory }
IF ColorCard
THEN BEGIN
DisplayPtr := PTR ($B800, 0) ;
StatusLinePtr := PTR ($B800, NrOfTextLines * ColsOnScreen * 2) ;
END
ELSE BEGIN
DisplayPtr := PTR ($B000, 0) ;
StatusLinePtr := PTR ($B000, NrOfTextLines * ColsOnScreen * 2) ;
END ;
{ store screen settings }
OrigCursorType := GetCursor ;
OrigTextAttr := TextAttr ;
{ initialize setup }
Config.Setup := DefaultSetup ;
TextAttr := ScreenColorArray [Config.Setup.ScreenColors].NormAttr ;
{ initialize paste buffer, macro stack and several global variables }
NEW (PasteBuffer) ;
PasteBuffersize := 0 ;
MacroStackpointer := Inactive ;
MacroDefining := Inactive ;
LoadfileName := '*.*' ;
FindString := '' ;
ReplaceString := '' ;
SearchOptions := '' ;
SearchType := Find ;
{ clear keyboard buffer }
ClearKeyBuffer ;
EscPressed := FALSE ;
{ create empty histories }
CreateHistory (FileHist, 80) ;
CreateHistory (FindHist, 255) ;
CreateHistory (ReplaceHist, 255) ;
{ initialize workspaces }
CurrentWsnr := 1 ;
REPEAT
NEW (Workspace [CurrentWsnr].Buffer) ;
ClearCurrentWs ;
{$IFDEF DEVELOP }
IF CurrentWsnr = 1
THEN BasicMemAvail := MEMAVAIL ;
{$ENDIF }
INC (CurrentWsnr) ;
UNTIL (CurrentWsnr > MaxNrOfWorkspaces) OR (MAXAVAIL < WsBufSize) ;
NrOfWorkspaces := CurrentWsnr - 1 ;
CurrentWsnr := 1 ;
CurrentWs := Workspace [CurrentWsnr] ;
{ initialize macros to default }
FOR Counter := 1 TO NrOfMacros DO
Config.Macro.Length [Counter] := Inactive ;
{ try to find setup file }
ConfigFilePath := '' ;
IF Exists (ConfigFileName)
THEN ConfigFilePath := FExpand (ConfigFileName)
ELSE BEGIN
IF LO (DosVersion) >= 3
THEN BEGIN
{ look for setup file in directory where AE.EXE is }
FSplit (PARAMSTR (0), AEDir, AEName, AEExt) ;
IF Exists (AEDir + ConfigFileName)
THEN ConfigFilePath := AEDir + ConfigFileName ;
END
END ;
ValidConfig := TRUE ;
IF LENGTH (ConfigFilePath) > 0
THEN BEGIN
{ load setup }
ASSIGN (ConfigFile, ConfigFilePath) ;
RESET (ConfigFile) ;
READ (ConfigFile, Config) ;
CLOSE (ConfigFile) ;
CheckDiskError ;
IF (DiskError <> 0) OR
(Config.Setup.Version < UpCompatSetupVersion) OR
(Config.Setup.Version > AEVersionNr)
THEN BEGIN
{ error reading setup file or incompatible version:
reset to default }
Config.Setup := DefaultSetup ;
FOR Counter := 1 TO NrOfMacros DO
Config.Macro.Length [Counter] := Inactive ;
ValidConfig := FALSE ;
END ;
END ;
Config.Setup.Version := AEVersionNr ;
{ set screen colors and cursor }
IF (NOT ColorCard) AND (Config.Setup.ScreenColors > 2)
THEN { on monochrome card only color settings 1 and 2 are valid }
Config.Setup.ScreenColors := 1 ;
TextAttr := ScreenColorArray [Config.Setup.ScreenColors].NormAttr ;
CLRSCR ;
SetCursor (Config.Setup.Cursortype) ;
IF NOT ValidConfig
THEN ErrorMessage (19) ;
{ load file(s) to edit }
WorkFilePath := '' ;
IF LENGTH (PARAMSTR (1) ) = 0
THEN BEGIN
IF Config.Setup.SaveWork
THEN BEGIN
{ look for work file }
IF Exists (WorkFileName)
THEN WorkFilePath := FExpand (WorkFileName)
ELSE BEGIN
IF LO (DosVersion) >= 3
THEN BEGIN
{ look in directory where AE.EXE is }
FSplit (PARAMSTR (0), AEDir, AEName, AEExt) ;
IF Exists (AEDir + WorkFileName)
THEN WorkFilePath := AEDir + WorkFileName ;
END ;
END ;
END ;
IF WorkFilePath = ''
THEN Message ('Another Editor, version ' + AEVersionNr +
'. Press F1 for help')
ELSE BEGIN
{ load work file }
ASSIGN (WorkFile, WorkFilePath) ;
RESET (WorkFile) ;
READ (WorkFile, Work) ;
CLOSE (WorkFile) ;
IF (DiskError <> 0) OR
(Work.Version < UpCompatWorkVersion) OR
(Work.Version > AEVersionNr)
THEN ErrorMessage (23)
ELSE BEGIN
IF Work.NrOfWorkspaces > NrOfWorkspaces
THEN Work.NrOfWorkspaces := NrOfWorkspaces ;
FOR CurrentWsnr := 1 TO Work.NrOfWorkspaces DO
BEGIN
LoadFile (Work.Filename [CurrentWsnr]) ;
{ set cursor position }
FOR Counter := 1 TO
(Work.CursorPos [CurrentWsnr].Linenr - 1) DO
LineDown (CurrentWs.CurPos) ;
EndOfLine (CurrentWs.CurPos) ;
IF (Work.CursorPos [CurrentWsnr].Index <
CurrentWs.CurPos.Index)
THEN SkipUp (CurrentWs.CurPos,
(CurrentWs.CurPos.Index -
Work.CursorPos [CurrentWsnr].Index) ) ;
CurrentWs.FirstVisibleLine :=
Work.FirstVisibleLine [CurrentWsnr] ;
CurrentWs.FirstScreenCol :=
Work.FirstScreenCol [CurrentWsnr] ;
Workspace[CurrentWsnr] := CurrentWs ;
END ;
CurrentWsnr := Work.CurrentWsnr ;
CurrentWs := Workspace [CurrentWsnr] ;
END ;
END ;
END
ELSE BEGIN
LoadfileName := FExpand (PARAMSTR (1) ) ;
AddToHistory (FileHist,UpperCase(PARAMSTR (1))) ;
IF Wildcarded (Loadfilename)
THEN BEGIN
GetFileFromList (LoadfileName) ;
IF NOT EscPressed
THEN LoadFile (LoadfileName) ;
END
ELSE LoadFile (LoadfileName) ;
END ;
{$IFDEF DEVELOP }
StdMemAvail := MEMAVAIL ;
MinMemAvail := MEMAVAIL ;
{$ENDIF }
END ;
{-----------------------------------------------------------------------------}
{ Saves workspace and restores screen settings before exiting program. }
{-----------------------------------------------------------------------------}
PROCEDURE ShutOff ;
VAR WorkFile : FILE OF WorkBlock ;
Work : WorkBlock ;
i : BYTE ;
BEGIN
IF Config.Setup.SaveWork
THEN BEGIN
{save work file }
IF LENGTH (WorkFilePath) = 0
THEN WorkFilePath := FExpand (WorkFileName) ;
Work.Banner := WorkFileName ;
Work.Version := AEVersionNr ;
Work.NrOfWorkspaces := NrOfWorkspaces ;
FOR i := 1 TO MaxNrOfWorkspaces DO
BEGIN
Work.Filename [i] := Workspace [i].Name ;
Work.CursorPos [i] := Workspace [i].CurPos ;
Work.FirstVisibleLine [i] := Workspace [i].FirstVisibleLine ;
Work.FirstScreenCol [i] := Workspace [i].FirstScreenCol ;
END ;
Work.CurrentWsnr := CurrentWsnr ;
ASSIGN (WorkFile, WorkFilePath) ;
REWRITE (WorkFile) ;
WRITE (WorkFile, Work) ;
CLOSE (WorkFile) ;
END ;
SetCursor (OrigCursorType) ;
TextAttr := OrigTextAttr ;
CLRSCR ;
{$IFDEF DEVELOP }
WRITELN ('HEAP MEMORY:') ;
WRITELN ('Available at startup ',InitMemAvail:6, ' bytes') ;
WRITELN ('Minimal needs (1 workspace) ',(InitMemAvail-BasicMemAvail):6,
' bytes') ;
IF NrOfWorkspaces > 1
THEN WRITELN ('Needed for ',NrOfWorkspaces,' workspaces ',
(InitMemAvail-StdMemAvail):6,' bytes') ;
WRITELN ('Dynamically used ',(StdMemAvail-MinMemAvail):6,
' bytes') ;
WRITELN ('Always available ',MinMemAvail:6, ' bytes') ;
{$ENDIF }
END ;
{-----------------------------------------------------------------------------}
{ Executes the action corresponding to the key number given. }
{-----------------------------------------------------------------------------}
PROCEDURE ExecKey (KeyNr : WORD) ;
VAR Counter : WORD ;
OldCurPos : Position ;
MacroNumber : WORD ;
NextPos : Position ;
BlockStart, BlockStop : WORD ;
TabSteps : WORD ;
LineLength, NewSpaces : WORD ;
OldMark : WORD ;
BEGIN
WITH CurrentWs DO
BEGIN
CASE KeyNr OF
331 : { left }
BEGIN
IF (Buffer^ [CurPos.Index - 2] = CR) AND (Buffer^ [CurPos.Index - 1] = LF)
THEN SkipUp (CurPos, 2)
ELSE SkipUp (CurPos, 1) ;
END ;
333 : { right }
BEGIN
IF (Buffer^ [CurPos.Index] = CR) AND (Buffer^ [CurPos.Index + 1] = LF)
THEN SkipDown (CurPos, 2)
ELSE SkipDown (CurPos, 1) ;
END ;
328 : { up }
BEGIN
LineUp (CurPos) ;
END ;
336 : { down }
BEGIN
LineDown (CurPos) ;
END ;
327 : { Home }
BEGIN
Home (CurPos) ;
END ;
335 : { End }
BEGIN
EndOfLine (CurPos) ;
END ;
329 : { PgUp }
BEGIN
FOR Counter := 1 TO (NrOfTextLines - 1) DO
LineUp (CurPos) ;
END ;
337 : { PgDn }
BEGIN
FOR Counter := 1 TO (NrOfTextLines - 1) DO
LineDown (CurPos) ;
END ;
388 : { ^PgUp }
BEGIN
CurPos.Index := 1 ;
CurPos.Linenr := 1 ;
CurPos.Colnr := 1 ;
END ;
374 : { ^PgDn }
BEGIN
FOR Counter := CurPos.Index TO BufferSize DO
IF Buffer^ [Counter] = LF THEN INC (CurPos.Linenr) ;
CurPos.Index := BufferSize ;
CalculateColnr (CurPos) ;
END ;
375 : { ^Home }
BEGIN
WHILE CurPos.Linenr > FirstVisibleLine.Linenr
DO LineUp (CurPos) ;
Home (CurPos) ;
END ;
373 : { ^End }
BEGIN
WHILE (CurPos.Linenr < (FirstVisibleLine.Linenr + NrOfTextLines - 1) ) AND
(CurPos.Index < BufferSize)
DO LineDown (CurPos) ;
Home (CurPos) ;
END ;
371 : { ^left }
BEGIN
IF CurPos.Index > 1
THEN BEGIN
REPEAT DEC (CurPos.Index) ;
IF Buffer^ [CurPos.Index] = LF
THEN DEC (CurPos.Linenr) ;
UNTIL ( (NOT (Buffer^ [CurPos.Index] IN WordSeparators) ) OR
(CurPos.Index = 1) ) ;
WHILE ( (NOT (Buffer^ [CurPos.Index] IN WordSeparators) ) AND
(CurPos.Index > 0) ) DO
DEC (CurPos.Index) ;
INC (CurPos.Index) ;
CalculateColnr (CurPos) ;
END ;
END ;
372 : { ^right }
BEGIN
WHILE NOT ( (Buffer^ [CurPos.Index] IN WordSeparators) OR
(CurPos.Index = BufferSize) ) DO
INC (CurPos.Index) ;
WHILE (Buffer^ [CurPos.Index] IN WordSeparators) AND
(CurPos.Index < BufferSize) DO
BEGIN
IF Buffer^ [CurPos.Index] = LF
THEN INC (CurPos.Linenr) ;
INC (CurPos.Index) ;
END ;
CalculateColnr (CurPos) ;
END ;
340 : { shift-F1 }
BEGIN
AlterSetup ;
END ;
316 : { F2 }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
SaveFile (CurrentWsnr) ;
CurrentWs := Workspace [CurrentWsnr] ;
END ;
341 : { shift-F2 }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
EnterString (Name, NIL, 'New file name: ', 79, TRUE, TRUE) ;
IF NOT EscPressed
THEN BEGIN
Name := FExpand (Name) ;
SaveFile (CurrentWsnr) ;
END ;
CurrentWs := Workspace [CurrentWsnr] ;
END ;
317 : { F3 }
BEGIN
LoadfileName := '*.*' ;
EnterString (LoadfileName, FileHist, 'Load file: ', 79, TRUE, TRUE) ;
IF Wildcarded (LoadfileName) AND (NOT EscPressed)
THEN GetFileFromList (LoadfileName) ;
IF NOT EscPressed
THEN
BEGIN
IF ChangesMade
THEN
BEGIN
IF Answer ('File has been changed. Save?')
THEN SaveFile (CurrentWsnr) ;
END ;
IF NOT EscPressed
THEN LoadFile (LoadfileName) ;
END ;
END ;
342 : { shift-F3 }
BEGIN
LoadfileName := '*.*' ;
EnterString (LoadfileName, FileHist, 'Insert file: ', 79, TRUE, TRUE) ;
IF Wildcarded (LoadfileName) AND (NOT EscPressed)
THEN GetFileFromList (LoadfileName) ;
IF NOT EscPressed
THEN InsertFile (LoadfileName, CurPos) ;
END ;
305 : { alt-N }
BEGIN
EscPressed := FALSE ;
IF ChangesMade
THEN
BEGIN
IF Answer ('File has been changed. Save?')
THEN SaveFile (CurrentWsnr) ;
END ;
IF NOT EscPressed
THEN
BEGIN
ClearCurrentWs ;
END ;
END ;
318, 343,
275 : { F4,shift-F4,alt-R }
BEGIN
IF KeyNr <> 275
THEN
BEGIN
{ if size of block <= 255: copy contents to FindString }
IF Mark <> Inactive
THEN BEGIN
IF Mark < CurPos.Index
THEN BEGIN
BlockStart := Mark ;
BlockStop := Curpos.Index ;
END
ELSE BEGIN
BlockStart := Curpos.Index ;
BlockStop := Mark ;
END ;
IF (BlockStop - BlockStart) <= 255
THEN BEGIN
MOVE (Buffer^ [BlockStart], FindString [1],
BlockStop - BlockStart) ;
FindString [0] := CHR (BlockStop - BlockStart) ;
END ;
END
ELSE FindString := '' ;
{ enter new search parameters }
EnterString (FindString, FindHist, 'Find: ', 255, FALSE, FALSE) ;
IF (KeyNr = 343) AND (NOT EscPressed)
THEN EnterString (ReplaceString, ReplaceHist, 'Replace with: ',
255, FALSE, FALSE) ;
IF NOT EscPressed
THEN
BEGIN
IF KeyNr = 318
THEN BEGIN
EnterString (SearchOptions, NIL,
'Options (I,R,W): ',
6, TRUE, TRUE) ;
SearchType := Find ;
END
ELSE BEGIN
EnterString (SearchOptions, NIL,
'Options (I,N,R,W): ',
6, TRUE, TRUE) ;
SearchType := FindAndReplace ;
END ;
END ;
END ;
IgnoreCase := POS ('I', SearchOptions) <> 0 ;
ReverseSearch := POS ('R', SearchOptions) <> 0 ;
NoQuery := POS ('N', SearchOptions) <> 0 ;
WholeWords := POS ('W', SearchOptions) <> 0 ;
IF (NOT EscPressed) OR (KeyNr = 275)
THEN
BEGIN
{ start search }
OldCurPos := CurPos ;
SearchString (FindString, CurPos) ;
IF NOT Found
THEN
BEGIN
CurPos := OldCurPos ;
ErrorMessage (15) ;
END ;
IF Found AND (SearchType = FindAndReplace)
THEN
BEGIN
{ Counter will contain number of replacements made }
Counter := 0 ;
REPEAT
{ show found string as block (if queried replace) }
OldMark := Mark ;
MARK := CurPos.Index + LENGTH (FindString) ;
IF NOT NoQuery
THEN RedrawScreen ;
{ restore block mark }
Mark := OldMark ;
{ determine if string must be replaced }
IF NoQuery OR Answer ('Replace?')
THEN
BEGIN
{ OldCurPos will point to last replaced string }
OldCurPos := CurPos ;
{ replace FindString with ReplaceString }
IF LENGTH (FindString) >= LENGTH (ReplaceString)
THEN
BEGIN
{ adapt buffer size }
Shrink (CurPos.Index, LENGTH (FindString) -
LENGTH (ReplaceString) ) ;
IF LENGTH (ReplaceString) > 0
THEN
BEGIN
{ write ReplaceString }
MOVE (ReplaceString [1],
Buffer^ [CurPos.Index],
LENGTH (ReplaceString) ) ;
IF NOT ReverseSearch
THEN
BEGIN
{ resume search after ReplaceString }
SkipDown (CurPos,
LENGTH (ReplaceString) - 1) ;
END ;
END ;
INC (Counter) ;
END
ELSE
BEGIN
IF Grow (CurPos.Index,
LENGTH (ReplaceString) -
LENGTH (FindString) )
THEN
BEGIN
{ write ReplaceString }
MOVE (ReplaceString [1],
Buffer^ [CurPos.Index],
LENGTH (ReplaceString) ) ;
IF NOT ReverseSearch
THEN
BEGIN
{ resume search after ReplaceString }
SkipDown (CurPos,
LENGTH (ReplaceString) ) ;
END ;
INC (Counter) ;
END
ELSE
{ no room for replace: stop search }
EscPressed := TRUE ;
END ;
{ show replacement counter }
Message (WordToString (Counter, 0) +
' replacement(s) made') ;
END ;
IF NOT EscPressed
THEN CheckEsc ;
IF NOT EscPressed
THEN SearchString (FindString, CurPos) ;
UNTIL (NOT Found) OR EscPressed ;
{ return to last replaced string }
CurPos := OldCurPos ;
END ;
END ;
END ;
319 : { F5 }
BEGIN
MARK := CurPos.Index ;
END ;
344 : { shift-F5 }
BEGIN
MARK := Inactive ;
END ;
320 : { F6 }
BEGIN
IF CopyBlock
THEN BEGIN
DeleteBlock ;
END ;
END ;
345 : { shift-F6 }
BEGIN
DeleteBlock ;
END ;
321 : { F7 }
BEGIN
IF CopyBlock
THEN BEGIN
MARK := Inactive ;
Message ('Block copied into paste buffer') ;
END ;
END ;
346 : { shift-F7 }
BEGIN
IF MARK = Inactive
THEN ErrorMessage (5)
ELSE BEGIN
IF MARK < CurPos.Index
THEN BEGIN
BlockStart := MARK ;
BlockStop := CurPos.Index ;
END
ELSE BEGIN
BlockStart := CurPos.Index ;
BlockStop := MARK ;
END ;
Counter := BlockStart ;
WHILE (Buffer^ [Counter] =
PasteBuffer^ [Counter - BlockStart + 1]) AND
(Counter < BlockStop) DO
INC (Counter) ;
IF (Counter >= BlockStop) AND
( (BlockStop - BlockStart) = PasteBufferSize)
THEN Message ('Block is equal to paste buffer')
ELSE Message ('Block differs from paste buffer at' +
' character '+
WordToString(Counter-BlockStart+1,0)) ;
END ;
END ;
322 : { F8 }
BEGIN
IF InsertBlock THEN
SkipDown (Curpos, PasteBufferSize) ;
END ;
347 : { shift-F8 }
BEGIN
IF MARK = Inactive
THEN ErrorMessage (5)
ELSE BEGIN
IF MARK < CurPos.Index
THEN PrintBlock (Buffer, MARK, CurPos.Index - 1)
ELSE PrintBlock (Buffer, CurPos.Index, MARK - 1) ;
END ;
END ;
281 : { alt-P }
BEGIN
IF Answer ('Print entire file buffer?')
THEN PrintBlock (Buffer, 1, BufferSize - 1) ;
END ;
323 : { F9 }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
IF CurrentWsnr = NrOfWorkspaces
THEN CurrentWsnr := 1
ELSE INC (CurrentWsnr) ;
CurrentWs := Workspace [CurrentWsnr] ;
END ;
348 : { shift-F9 }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
IF CurrentWsnr = 1
THEN CurrentWsnr := NrOfWorkspaces
ELSE DEC (CurrentWsnr) ;
CurrentWs := Workspace [CurrentWsnr] ;
END ;
324 : { F10 }
BEGIN
{ restore screen settings }
TextAttr := OrigTextAttr ;
SetCursor (OrigCursorType) ;
CLRSCR ;
WRITELN ('Type EXIT to return to AE ...') ;
SwapVectors ;
EXEC (GetEnv ('COMSPEC'), '') ;
SwapVectors ;
IF DosError <> 0
THEN ErrorMessage (14) ;
{ reset screen settings }
TextAttr := ScreenColorArray [Config.Setup.ScreenColors].NormAttr ;
SetCursor (Config.Setup.CursorType) ;
END ;
274 : { alt-E }
BEGIN
WRITE (Lst, FF) ;
CheckDiskError ;
END ;
286 : { alt-A }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
CurrentWsnr := 1 ;
CurrentWs := Workspace [CurrentWsnr] ;
END ;
376..
385 : { alt-1 .. alt-0 }
BEGIN
MacroNumber := KeyNr - 375 ;
IF MacroDefining = MacroNumber
THEN BEGIN
DEC (Config.Macro.LENGTH [MacroDefining]) ;
ErrorMessage (9) ;
END
ELSE BEGIN
IF Config.Macro.LENGTH [MacroNumber] > 0
THEN BEGIN
IF MacroStackpointer = MacroStackDepth
THEN BEGIN
MacroStackpointer := Inactive ;
ErrorMessage (10) ;
END
ELSE BEGIN
{ push macro onto MacroStack }
INC (MacroStackpointer) ;
WITH MacroStack [MacroStackpointer] DO
BEGIN
Macronr := MacroNumber ;
Index := 1 ;
END ;
END ;
END ;
END ;
END ;
288 : { alt-D }
BEGIN
IF MacroDefining = Inactive
THEN BEGIN
{ Start define mode }
MacroNumber := 1 ;
EnterWord (MacroNumber,
'Define keyboard Macro nr. (1-10): ', 1, 10) ;
IF NOT EscPressed
THEN BEGIN
{ reset old macro }
Config.Macro.LENGTH [MacroNumber] := 0 ;
MacroDefining := MacroNumber ;
END ;
END
ELSE { end define mode }
MacroDefining := Inactive ;
END ;
289 : { alt-F }
BEGIN
IF Config.Setup.WordWrapLength = Inactive
THEN ErrorMessage (11)
ELSE BEGIN
FormatParagraph (CurPos) ;
WordDown (CurPos) ;
END ;
END ;
292, 302 : { alt-J, alt-C }
BEGIN
IF Config.Setup.WordWrapLength = Inactive
THEN ErrorMessage (11)
ELSE BEGIN
{ measure line length }
EndOfLine (CurPos) ;
{ remove trailing spaces }
Counter := 1 ;
WHILE (Buffer^ [CurPos.Index - Counter] = ' ') AND
(Counter < CurPos.Colnr) DO
INC (Counter) ;
DEC (CurPos.Index, Counter - 1) ;
DEC (CurPos.Colnr, Counter - 1) ;
Shrink (CurPos.Index, Counter - 1) ;
LineLength := CurPos.Colnr - 1 ;
{ remove leading spaces }
Home (CurPos) ;
Counter := 0 ;
WHILE (Buffer^ [CurPos.Index + Counter] = ' ') AND
(Counter <= LineLength) DO
INC (Counter) ;
Shrink (CurPos.Index, Counter) ;
DEC (LineLength, Counter) ;
NewSpaces := (Config.Setup.WordWrapLength - LineLength) ;
IF KeyNr = 302
THEN NewSpaces := NewSpaces DIV 2 ;
IF NewSpaces > 0
THEN InsertSpaces (CurPos, NewSpaces) ;
END
END ;
306 : { alt-M }
BEGIN
OldCurPos := CurPos ;
Found := TRUE ;
CASE Buffer^ [CurPos.Index] OF
'{' : MatchBracketsDown ('{', '}', CurPos) ;
'}' : MatchBracketsUp ('{', '}', CurPos) ;
'(' : MatchBracketsDown ('(', ')', CurPos) ;
')' : MatchBracketsUp ('(', ')', CurPos) ;
'[' : MatchBracketsDown ('[', ']', CurPos) ;
']' : MatchBracketsUp ('[', ']', CurPos) ;
'<' : MatchBracketsDown ('<', '>', CurPos) ;
'>' : MatchBracketsUp ('<', '>', CurPos) ;
ELSE Message ('Cursor must be on bracket ({[<>]})') ;
END ; { of case }
IF NOT Found
THEN BEGIN
Message ('No matching bracket found') ;
CurPos := OldCurPos ;
END ;
END ;
287 : { alt-S }
BEGIN
IF PosStackpointer = PosStackDepth
THEN ErrorMessage (12)
ELSE BEGIN
INC (PosStackpointer) ;
PosStack [PosStackpointer] := CurPos.Index ;
END ;
END ;
290 : { alt-G }
BEGIN
IF PosStackpointer = Inactive
THEN ErrorMessage (13)
ELSE BEGIN
IF CurPos.Index < PosStack [PosStackpointer]
THEN SkipDown (CurPos,
PosStack [PosStackpointer] - CurPos.Index)
ELSE SkipUp (CurPos,
CurPos.Index - PosStack [PosStackpointer]) ;
DEC (PosStackpointer) ;
END ;
END ;
276, 278 : { alt-T, alt-U }
BEGIN
IF MARK = Inactive
THEN BEGIN
IF KeyNr = 276
THEN BEGIN
IF Buffer^ [CurPos.Index] IN ['A'..'Z', 'a'..'z']
THEN BEGIN
Buffer^ [CurPos.Index] :=
CHR (ORD (Buffer^ [CurPos.Index]) XOR $20) ;
ChangesMade := TRUE ;
END ;
SkipDown (CurPos, 1) ;
END
ELSE BEGIN
IF Buffer^ [CurPos.Index] IN ['a'..'z']
THEN BEGIN
Buffer^ [CurPos.Index] :=
UPCASE (Buffer^ [CurPos.Index]) ;
ChangesMade := TRUE ;
END ;
SkipDown (CurPos, 1) ;
END
END
ELSE BEGIN
IF MARK < CurPos.Index
THEN BEGIN
BlockStart := MARK ;
BlockStop := CurPos.Index ;
END
ELSE BEGIN
BlockStart := CurPos.Index ;
BlockStop := MARK ;
END ;
IF KeyNr = 276
THEN BEGIN
{ toggle case }
FOR Counter := BlockStart TO (BlockStop - 1) DO
IF Buffer^ [Counter] IN ['A'..'Z', 'a'..'z']
THEN BEGIN
Buffer^ [Counter] :=
CHR (ORD (Buffer^ [Counter]) XOR $20) ;
ChangesMade := TRUE ;
END ;
END
ELSE BEGIN
{ convert to upper case }
FOR Counter := BlockStart TO (BlockStop - 1) DO
IF Buffer^ [Counter] IN ['a'..'z']
THEN BEGIN
Buffer^ [Counter] :=
UPCASE (Buffer^ [Counter]) ;
ChangesMade := TRUE ;
END ;
END ;
END ;
END ;
0..255 : { character-keys }
BEGIN
IF KeyNr = 26
THEN Message ('Warning: Inserting end-of-file character') ;
IF (NOT Config.Setup.Insertmode) AND
(NOT ( (Buffer^ [CurPos.Index] = CR) AND
(Buffer^ [CurPos.Index + 1] = LF) ) ) AND
(Buffer^ [CurPos.Index] <> LF) AND
(CurPos.Index < Buffersize)
THEN BEGIN
{ if in overwrite mode and not at }
{ end of line or buffer: overwrite character }
Buffer^ [CurPos.Index] := CHR (KeyNr) ;
INC (CurPos.Index) ;
IF KeyNr = 13
THEN BEGIN
INC (Curpos.Linenr) ;
CurPos.Colnr := 1 ;
END
ELSE INC (CurPos.Colnr) ;
ChangesMade := TRUE ;
END
ELSE BEGIN
IF Grow (CurPos.Index, 1)
THEN BEGIN
{ insert character }
Buffer^ [CurPos.Index] := CHR (KeyNr) ;
INC (CurPos.Index) ;
IF KeyNr = 13
THEN BEGIN
INC (Curpos.Linenr) ;
CurPos.Colnr := 1 ;
END
ELSE INC (CurPos.Colnr) ;
END ;
END ;
{ check if line must be broken }
IF (Config.Setup.WordWrapLength <> Inactive)
THEN BEGIN
IF (CurPos.Colnr > Config.Setup.WordWrapLength)
THEN BEGIN
OldCurPos := CurPos ;
{ find position for line break }
REPEAT WordUp (CurPos) ;
UNTIL (CurPos.Colnr <= Config.Setup.WordWrapLength)
OR (CurPos.Linenr < OldCurPos.Linenr) ;
{ use NextPos to store index value of CurPos }
NextPos := CurPos ;
IF (CurPos.Linenr = OldCurPos.Linenr)
THEN BEGIN
{ remove spaces at end of line }
Counter := 1 ;
WHILE (Buffer^[Curpos.Index-Counter] = ' ')
AND (Counter < Curpos.Colnr) DO
INC (Counter) ;
{ only break line if not at left margin }
IF Counter < CurPos.Colnr
THEN BEGIN
DEC (Counter) ;
Shrink (CurPos.Index-Counter,Counter) ;
DEC (CurPos.Index,Counter) ;
DEC (CurPos.Colnr,Counter) ;
InsertCRLF (CurPos) ;
END ;
END ;
{ restore position }
SkipDown (CurPos,OldCurPos.Index - NextPos.Index) ;
FirstScreenCol := 1 ;
END ;
END ;
END ;
266, 269 : { Enter,^Enter }
BEGIN
InsertCRLF (CurPos) ;
END ;
265 : { Tab }
BEGIN
IF Config.Setup.TabSpacing = 0
THEN BEGIN
{ find nearest beginning of word in previous line }
OldCurPos := CurPos ;
LineUp (Curpos) ;
WHILE (CurPos.Colnr <= OldCurPos.Colnr) AND
(CurPos.Linenr < OldCurpos.Linenr) DO
WordDown (CurPos) ;
IF CurPos.Linenr < OldCurpos.Linenr
THEN TabSteps := Curpos.Colnr - OldCurpos.Colnr
ELSE TabSteps := 0 ;
CurPos := OldCurPos ;
END
ELSE BEGIN
{ fixed-distance tabs }
TabSteps := Config.Setup.TabSpacing -
( (CurPos.Colnr - 1) MOD Config.Setup.TabSpacing) ;
END ;
IF (NOT Config.Setup.Insertmode)
THEN BEGIN
{ overwrite mode: skip tabsteps until eoln or eof }
WHILE (TabSteps > 0) AND
(Buffer^ [CurPos.Index] <> LF) AND
(CurPos.Index < Buffersize) DO
BEGIN
INC (CurPos.Index) ;
INC (CurPos.Colnr) ;
DEC (TabSteps) ;
END ;
{ rest will be inserted as spaces }
END ; { of if }
IF TabSteps > 0
THEN InsertSpaces (CurPos, TabSteps) ;
END ;
271 : { shift-Tab }
BEGIN
IF Config.Setup.TabSpacing = 0
THEN BEGIN
OldCurPos := CurPos ;
LineUp (CurPos) ;
EndOfLine (CurPos) ;
IF CurPos.ColNr > OldCurPos.Colnr
THEN BEGIN
DEC (CurPos.Index, CurPos.Colnr - OldCurPos.Colnr) ;
CurPos.Colnr := OldCurpos.Colnr ;
END ;
WordUp (CurPos) ;
IF CurPos.Linenr = (OldCurpos.Linenr - 1)
THEN TabSteps := OldCurpos.Colnr - Curpos.Colnr
ELSE TabSteps := OldCurPos.Colnr - 1 ;
CurPos := OldCurPos ;
END
ELSE IF CurPos.Colnr > Config.Setup.TabSpacing
THEN BEGIN
TabSteps := (CurPos.Colnr - 1) MOD
Config.Setup.TabSpacing ;
IF TabSteps = 0
THEN TabSteps := Config.Setup.TabSpacing ;
END
ELSE TabSteps := CurPos.Colnr - 1 ;
DEC (CurPos.Index, TabSteps) ;
DEC (CurPos.Colnr, TabSteps) ;
END ;
338 : { Ins }
BEGIN
Config.Setup.Insertmode := NOT Config.Setup.Insertmode ;
END ;
339 : { Del }
BEGIN
IF CurPos.Index < Buffersize
THEN BEGIN
IF (Buffer^ [CurPos.Index] = CR) AND
(Buffer^ [CurPos.Index + 1] = LF)
THEN Shrink (CurPos.Index, 2)
ELSE Shrink (CurPos.Index, 1) ;
END ;
END ;
264 : { Backspace }
BEGIN
IF CurPos.Index > 1
THEN BEGIN
IF (Buffer^ [CurPos.Index - 1] = LF) AND
(Buffer^ [CurPos.Index - 2] = CR)
THEN BEGIN
SkipUp (CurPos, 2) ;
Shrink (CurPos.Index, 2) ;
END
ELSE BEGIN
SkipUp (CurPos, 1) ;
Shrink (CurPos.Index, 1) ;
END ;
END ;
END ;
273 : { alt-W }
BEGIN
NextPos := CurPos ;
{ if at end of line: skip line separator }
IF (Buffer^ [NextPos.Index] = LF) OR
((Buffer^ [NextPos.Index] = CR) AND
(Buffer^ [NextPos.Index+1] = LF))
THEN LineDown (NextPos)
ELSE BEGIN
{ skip to end of word }
WHILE (Buffer^ [NextPos.Index] IN
['0'..'9','A'..'Z','a'..'z']) AND
(NextPos.Index < BufferSize) DO
BEGIN Inc (NextPos.Index) ;
Inc (NextPos.Colnr) ;
END ;
IF (Buffer^ [NextPos.Index] <> LF) AND
(NOT ((Buffer^ [NextPos.Index] = CR) AND
(Buffer^ [NextPos.Index+1] = LF)))
THEN SkipDown (Nextpos,1) ;
{ skip all subsequent spaces }
WHILE (Buffer^ [NextPos.Index] = ' ') AND
(NextPos.Index < BufferSize)
DO BEGIN
INC (NextPos.Index) ;
INC (NextPos.Colnr) ;
END ;
END ;
Shrink (CurPos.Index, NextPos.Index - CurPos.Index) ;
END ;
294 : { alt-L }
BEGIN
Home (CurPos) ;
NextPos := CurPos ;
LineDown (NextPos) ;
Shrink (CurPos.Index, NextPos.Index - CurPos.Index) ;
END ;
301 : { alt-X }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
Counter := 1 ;
EscPressed := FALSE ;
WHILE (Counter <= NrOfWorkspaces) AND (NOT EscPressed) DO
BEGIN
WITH Workspace [Counter] DO
IF ChangesMade
THEN BEGIN
IF Config.Setup.SaveOnExit
THEN SaveFile (Counter)
ELSE IF Answer ('File in ' + CHR (64 + Counter) +
' has been changed. Save?')
THEN BEGIN
SaveFile (Counter) ;
{ if save unsuccessful: }
{ stop exit procedure }
IF ChangesMade
THEN EscPressed := TRUE ;
END ;
END ;
INC (Counter) ;
END ; { of while }
{ do not exit from program if Escape was pressed }
ProgramFinished := NOT EscPressed ;
END ;
272 : { alt-Q }
BEGIN
Workspace [CurrentWsnr] := CurrentWs ;
DisplayInfo ;
END ;
300 : { alt-Z }
BEGIN
Message ('Another Editor by Dick Alstein. Version '
+ AEVersionNr + ', ' + AEVersionDate + '.') ;
END ;
283 : { Escape }
BEGIN
MARK := Inactive ;
END ;
ELSE BEGIN
WarningBeep ;
Message ('This key has no function') ;
END ;
END ; { of case }
CASE KeyNr OF
0..255, 264, 265, 266, 269, 273, 320, 322, 339, 345 :
{ char-keys, Backspace, Tab, Enter, ^Enter, Alt-W, F6, F8, Del, Shift-F6 }
IF Config.Setup.AutoWrap
THEN BEGIN
{ do auto-wrap }
OldCurPos := CurPos ;
FormatParagraph (CurPos) ;
CurPos := OldCurpos ;
END ;
END ;
CASE KeyNr OF
328, 336, 329, 337, 375, 373 : { up,down,PgUp,PgDn,^Home, ^End }
BEGIN
{ when moving vertically through the buffer: }
{ try to make Colnr equal to VirtualColnr }
{ (i.e. the value that it "should" have) }
WHILE (CurPos.Colnr < VirtualColnr) AND
(Buffer^ [CurPos.Index] <> LF) AND
(CurPos.Index < BufferSize) DO
BEGIN
INC (CurPos.Index) ;
INC (CurPos.Colnr) ;
END ;
IF (Buffer^ [CurPos.Index] = LF) AND
(Buffer^ [CurPos.Index - 1] = CR)
THEN BEGIN
DEC (CurPos.Index) ;
DEC (CurPos.Colnr) ;
END ;
END ;
ELSE { all other keys }
VirtualColnr := Curpos.Colnr ;
END ; { of case }
END ; { of with }
END ; { of procedure }
{-----------------------------------------------------------------------------}
BEGIN
END.