!!! String Library

(c) 1991 Carsten Strotmann

{{{

;********************************
;**                            **
;** Phoenix SoftCrew ACTION!   **
;** Programme und Tips f. 8Bit **
;**                            **
;********************************

; Programmname:Stringroutinen
; Programmierer:Carsten Strotmann
; Filename:STRING.ACT
; erste Version:
; letzte Aenderung:
; Zweck:
; Bemerkung:
; benoetigt DIVERS.ACT
;

; INCLUDE "DIVERS.ACT"

BYTE FUNC Find (BYTE ARRAY str2,str1)

  BYTE len1,len2,z1,z2,flg,pos

  IF str1(0)>=str2(0) THEN
   len2=str2(0)
   len1=str1(0)
   len1==-len2+1
   z1=0
   z2=0
   DO
    flg=$FF
    z1==+1
    FOR z2=1 to len2
    DO
     IF str1(z1+z2-1)#str2(z2) THEN
      flg=0
     FI
    OD
   UNTIL z1=len1 OR flg#0
   OD
   IF flg#0 THEN
    pos=z1
   ELSE
    pos=0
   FI
  ELSE
   pos=0
  FI

RETURN (pos)

;----------------------------------

PROC Hex (CARD value,BYTE ARRAY hex)

  BYTE u,v1,v2

  BYTE ARRAY hexx ($10)=~['0 '1 '2 '3 '4 '5 '6 '7 '8 '9 'A 'B 'C 'D 'E 'F]

  v1=value RSH 8
  v2=value

  u=v1 RSH 4
  hex(1)=hexx(u)
  u=v1 MOD $10
  hex(2)=hexx(u)
  u=v2 RSH 4
  hex(3)=hexx(u)
  u=v2 MOD $10
  hex(4)=hexx(u)

  hex(0)=4

  IF v1=0 THEN
   hex(1)=hex(3)
   hex(2)=hex(4)
   hex(0)=2
  FI

RETURN

;-----------------------------------

CARD FUNC Dec (BYTE ARRAY hexc)

  BYTE v1,v2,pos
  BYTE ARRAY such(2),hexd($11)
  CARD result

  pos=1
  v1=0
  v2=0
  Scopy (hexd,"0123456789ABCDEF")

  IF hexc(0)=4 THEN
   such(0)=1
   such(1)=hexc(pos)
   v1=Find (such,hexd)-1 
   v1==*$10
   pos==+1
   such(1)=hexc(pos)
   v1==+Find (such,hexd)-1
   pos==+1
  FI

  IF hexc(0)=4 OR hexc(0)=2 THEN
   such(0)=1
   such(1)=hexc(pos)
   v2=Find (such,hexd)-1 
   v2==*$10
   pos==+1
   such(1)=hexc(pos)
   v2==+Find (such,hexd)-1
  FI

  result=v1
  RESULT==*$100
  result==+v2

RETURN (result)

;----------------------------------

PROC Upper (BYTE ARRAY text)

  BYTE u

  FOR u=1 TO text(0)
  DO
   IF text(u)>$60 AND text(u)<$7B THEN
    text(u)==-$20
   FI
  OD

RETURN

;-----------------------------------

PROC Lower (BYTE ARRAY text)

  BYTE u

  FOR u=1 TO text(0)
  DO
   IF text(u)>$40 AND text(u)<$5B THEN
    text(u)==+$20
   FI
  OD

RETURN

PROC Getin (BYTE ARRAY text,BYTE len)

  BYTE ascii,pos,u,inv

  pos=text(0)+1
  inv=0

  IF text(0)#0 THEN
   Print (text)
  FI

  DO
   ascii=Inkey ()

   IF ascii=129 THEN
    inv==!$80
   FI
   IF ascii=$1E AND pos>1 THEN
    pos==-1
    PutD (0,$1E)
   FI
   IF ascii=$7E AND pos>1 THEN
    pos==-1
    PutD (0,$7E)
   FI
   IF ascii=$1F AND pos#len+1 THEN
    pos==+1
    PutD (0,$1F)
   FI 
   IF ascii>26 AND ascii<32 THEN
    ascii=128
   FI
   IF pos#len+1 AND ascii<$7E THEN
    ascii==+inv
    PutD (0,ascii)
    text(pos)=ascii
    pos==+1
   FI
   text(0)=pos-1
   Klick (2)
  UNTIL ascii=$9B
  OD

RETURN

PROC ClearChar (BYTE ARRAY text)

  text(0)=0

RETURN

PROC FillString (BYTE ARRAY string,BYTE ch,BYTE len)

 BYTE u

 FOR u=1 TO len
 DO
  string(u)=ch
 OD

 string(0)=len

RETURN

PROC Sort (BYTE ARRAY field)

  BYTE len,flg,u

  len=field(0)
  DO
   flg=0
   FOR u=1 TO len-1
   DO
    IF field(u)>field(u+1) THEN
     flg=field(u+1)
     field(u+1)=field(u)
     field(u)=flg
     flg=1
    FI
   OD
  UNTIL flg=0
  OD

RETURN

PROC Inters (BYTE ARRAY string)

 BYTE u

 FOR u=1 TO string(0)
 DO
  string(u)=Inter(string(u))
 OD

RETURN

PROC RSet (BYTE ARRAY dest,source)

 BYTE l1,l2,u

 l1=dest(0)
 l2=source(0)

 IF l1>=l2 THEN
  FOR u=1 TO l1-l2
  DO
   dest(u)=32
  OD
  FOR u=1 TO l2
  DO
   dest (l1-l2+u)=source(u)
  OD

 FI

RETURN
}}}