home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / forth / strings.scr < prev    next >
Encoding:
Text File  |  1994-09-22  |  12.0 KB  |  1 lines

  1. \\                      *** Strings ***                13oct86we                                                                Dieses File enthält einige Grundworte zur Stringverarbeitung,   vor allem ein  SEARCH  für den Editor. Ebenfalls sind Worte     zur Umwandlung von counted Strings (Forth) in 0-terminated      Strings, wie sie z.B. vom Betriebssystem oft benutzt werden,    vorhanden.                                                                                                                      Beim SEARCH entscheidet die Variable  CAPS  , ob Groß- und      Kleinschreibung unterschieden wird oder nicht. Ist  CAPS  ON,   so werden große und kleine Buchstaben gefunden, die Suche dau-  ert allerdings länger.                                                                                                          c>0"  wandelt einen String mit führendem Countbyte in einen     mit 0 abgschlossenen, wie er vom Betriebssystem oft gebraucht   wird. 0>c" arbeitet umgekehrt.                                  \ String Functions Loadscreen                          25may86we                                                                1 4 +thru                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       \ -text                                                13oct86we                                                                Variable caps   caps off                                                                                                        Code -text   ( addr0 len addr1 -- n )                              SP )+ D6 move  D6 reg) A1 lea                                   SP )+ D0 move  0= IF  SP ) clr  Next  THEN  1 D0 subq           SP )+ D6 move  D6 reg) A0 lea                                Label comp                                                         .b A0 )+ A1 )+ cmpm  comp  D0 dbne                              .w D0 clr  .b A0 -) D0 move  A1 -) D0 sub   .w D0 ext              D0 SP -) move   Next end-code                                                                                             Label >upper   ( D3 -> D3 )     .b Ascii a D3 cmpi                 >= IF  Ascii z D3 cmpi  <= IF  bl D3 subi  THEN  THEN  rts                                                                   \ -capstext compare                                    13oct86we                                                                | Code -capstext   ( addr0 len addr1 -- n )                        SP )+ D6 move  D6 reg) A1 lea                                   SP )+ D0 move  0= IF  SP ) clr  Next  THEN  1 D0 subq           SP )+ D6 move  D6 reg) A0 lea                                Label capscomp                                                     .b A0 )+ D3 move  >upper bsr  D3 D1 move                           A1 )+ D3 move  >upper bsr  D3 D2 move                          D1 D2 cmp  capscomp D0 dbne   .w D1 clr                       .b A0 -) D3 move  >upper bsr  D3 D1 move                           A1 -) D3 move  >upper bsr  D3 D2 move                        .b D2 D1 sub  .w D1 SP -) move   Next end-code                                                                               : compare   ( addr0 len addr1 -- n )                               caps @ IF  -capstext  ELSE  -text  THEN ;                    \ search delete insert                                 10aug86we                                                                : search   ( text textlen buf buflen  -- offset flag )             over >r  2 pick -  3 pick c@ >r                                 BEGIN  caps @  0= IF  r@ scan  THEN  ?dup                       WHILE  >r >r  2dup r@  compare                                         0= IF  2drop r> rdrop rdrop r> -  true exit  THEN        r> r>  1 /string   REPEAT   -rot 2drop  rdrop  r> - false ;                                                                  : delete   ( buffer size count -- )                                over min >r  r@ - ( left over )  dup 0>                         IF  2dup swap dup  r@ +  -rot  swap  cmove  THEN               + r> bl fill ;                                                                                                                : insert   ( string length buffer size -- )                        rot over min >r  r@ - over dup r@ +  rot cmove>  r> cmove ;  \ String operators                                     13oct86we                                                                Variable $sum                   \ pointer to stringsum          : $add      ( addr len -- )     dup >r                             $sum @ count +  swap  move   $sum @  dup c@  r> +  swap c! ;                                                                 : c>0"   ( addr -- )                                               count >r  dup 1-  under  r@ cmove   r> + 0 swap c!  ;        : 0>c"   ( addr -- )                                               dup >r  true false scan nip negate 1-                           r@ dup 1+ 2 pick cmove>  r> c!  ;                                                                                            : ,0"   Ascii " parse 1+  here over allot  place                        0 c,  align ; restrict                                  : 0"    state @ IF compile (" ,0" compile 1+ exit THEN                             here 1+  ,0" ;        immediate                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              \ -text                                                13oct86we                                                                ist CAPS on, wird beim Suchen nicht auf Groß- Kleinschreibung    geachtet.                                                      addr0 und addr1 sind die Adressen von zwei counted strings, len  die Anzahl der Zeichen, die verglichen werden sollen. n liefert die Differenz der beiden ersten nicht übereinstimmenden Zeichen Ist n=0, sind beide Strings gleich.                                                                                                                                                                                                                                                                                                                                                            wandelt das Zeichen im Register D3 in den entsprechenden Groß-   buchstaben.                                                                                                                    \ -capstext compare                                    13oct86we                                                                wie -text, jedoch wird beim Vergleich nicht nach Groß- und Klein schreibung unterschieden. Dieser Vergleich erfordert erheblich  mehr Zeit und sollte daher nur in Sonderfällen benutzt werden.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 wie -text, in Abhängigkeit von der Variablen caps wird -text     oder -capstext ausgeführt.                                     \ search delete insert                                 13oct86we                                                                Im Text ab Adresse text wird in der Länge textlen  nach dem      String buf mit Länge buflen gesucht.                            Zurückgeliefert wird ein Offset in den durchsuchten Text an die Stelle, an der der String gefunden wurde sowie ein Flag. Ist    flag wahr, wurde der String gefunden, sonst nicht.              search berücksichtigt die Variable caps bei der Suche.                                                                         Im Buffer der Länge size werden count Zeichen entfernt. Der Rest des Buffers wird 'heruntergezogen'.                                                                                                                                                                                                                            Der string ab Adresse string und der Länge length wird in den    Buffer mit der Größe size eingefügt.                           \ String operators                                     13oct86we                                                                Ein pointer auf die Adresse des Strings, zu dem ein anderer      hinzugefügt werden soll.                                       $ADD hängt den String ab addr und der Länge len an den String    in $sum an. Der Count wird dabei addiert.                      wandelt den counted String ab addr in einen 0-terminated String.                                                                wandelt den 0-terminated String ab addr in einen counted String. Die Länge der Strings bleibt gleich (Countbyte statt 0).                                                                                                                                       legt einen counted und mit 0 abgeschlossenen String im            Dictionary ab.                                                aufrufendes Wort für ,0"; kompiliert zusätzlich (".              0" ist statesmart.