Browse Source

* Escape Escape and chars ord(char)<=16

pierre 23 years ago
parent
commit
a70d49311c
2 changed files with 53 additions and 5 deletions
  1. 7 1
      ide/fpdpansi.pas
  2. 46 4
      ide/wansi.pas

+ 7 - 1
ide/fpdpansi.pas

@@ -102,6 +102,9 @@ begin
           textattr:=Buffer[i*linesize+j] shr 8;
           if (textattr<>CurColor) and not SaveAsText then
             ChangeColor(textattr);
+          { Escape escape, by printing two #27 PM }
+          if (ch=#27) or (ord(ch)<=16) then
+            Write(f,#27);
           Write(f,ch);
         end;
       writeln(f);
@@ -112,7 +115,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.2  2001-11-15 13:30:14  pierre
+  Revision 1.3  2002-03-25 11:51:43  pierre
+   * Escape Escape and chars ord(char)<=16
+
+  Revision 1.2  2001/11/15 13:30:14  pierre
    + save ansi dump as text is filename suffix is '.txt'
 
   Revision 1.1  2001/08/04 11:30:23  peter

+ 46 - 4
ide/wansi.pas

@@ -93,6 +93,7 @@ type
        procedure   Write(Const S: string); virtual;
        procedure   WriteLn(Const S: string); virtual;
        procedure   WriteChar(C: char); virtual;
+       procedure   WriteCharRaw(C: char); virtual;
        procedure   DelLine(LineCount: integer); virtual;
        procedure   InsLine(LineCount: integer); virtual;
        procedure   HighVideo; virtual;
@@ -169,6 +170,7 @@ type
        procedure   ClrScr; virtual;
        procedure   ClrEol; virtual;
        procedure   WriteChar(C: char); virtual;
+       procedure   WriteCharRaw(C: char); virtual;
        procedure   DelLine(LineCount: integer); virtual;
        procedure   InsLine(LineCount: integer); virtual;
        procedure   UpdateCursor; virtual;
@@ -294,6 +296,11 @@ begin
   Abstract;
 end;
 
+procedure TConsoleObject.WriteCharRaw(C: char);
+begin
+  Abstract;
+end;
+
 procedure TConsoleObject.Write(Const S: string); {assembler;
 asm
   push   ds
@@ -501,14 +508,38 @@ var SkipThis : boolean;
     X,Y,Z    : integer;
 begin
   SkipThis:=false;
-  if C=Esc then begin ANSILevel:=1; SkipThis:=true; end else
-  if (ANSILevel=1) then
+  if C=Esc then
+    begin
+       { Treat EscEsc as a request to print a single Escape #27 char PM }
+      if AnsiLevel=0 then
+        begin
+          ANSILevel:=1;
+          SkipThis:=true;
+        end
+      else
+        begin
+          AnsiLevel:=0;
+          WriteCharRaw(c);
+          SkipThis:=true;
+        end;
+    end
+  else if (ANSILevel=1) then
      begin
        ANSILevel:=0;
        case C of
-            '[' : begin ANSILevel:=2; SkipThis:=true; end;
+            '[' : begin
+                    ANSILevel:=2;
+                    SkipThis:=true;
+                  end;
+       else
+       { Treat Esc+ AnyChar as a request to print that single char raw PM }
+         begin
+           WriteCharRaw(c);
+           SkipThis:=true;
+         end;
        end;
      end;
+
   if SkipThis=false then
   if (ANSILevel=2)
      then begin
@@ -708,6 +739,14 @@ begin
   end;
 end;
 
+procedure TANSIViewConsole.WriteCharRaw(C: char);
+var Pos: longint;
+begin
+  Pos:=(CurPos.Y-1)*MaxViewWidth+(WhereX-1);
+  Owner^.Buffer^[Pos]:=ord(C)+256*word(TextAttr);
+  GotoXY(WhereX+1,WhereY);
+end;
+
 procedure TANSIViewConsole.DelLine(LineCount: integer);
 begin
   Abstract;
@@ -1052,7 +1091,10 @@ end;
 END.
 {
  $Log$
- Revision 1.2  2001-08-12 00:04:50  pierre
+ Revision 1.3  2002-03-25 11:51:43  pierre
+  * Escape Escape and chars ord(char)<=16
+
+ Revision 1.2  2001/08/12 00:04:50  pierre
   * some speed improvements for string operations
 
  Revision 1.1  2001/08/04 11:30:25  peter