Grep for Sparta DOS#

General Information

Author: Carsten Strotmann
Language: ACTION!
Compiler/Interpreter: ACTION!
Published: 2003

GREP tool for Sparta DOS#

This is the first, very limited alpha version.

Limitations:#

  • Some bugs
  • only works on Sparta DOS 32GX
  • only works with ACTION! Cart
  • don't exit to DOS
  • only case sensitive
  • no parameter checking

To-Do:#

  • Case insensitive search
  • parameter checking
  • replace PEEK with BYTE POINTER
  • catch all bugs
  • trim RUNTIME part
  • use generic Sparta DOS Library

Usage:#

grep filename searchstring

Source (ACTION!)#

;***********************
;**                   **
;** SPARTA DOS GREP   **
;**                   **
;** (C) 2003 / GPL    **
;** CARSTEN STROTMANN **
;**                   **
;***********************
;


;SET 14=$4000
;SET $491=$4000 ; ORG = $4000
 
MODULE ; SYS.ACT

DEFINE EOL="$9B"
DEFINE OpenBuf = "$0500"
DEFINE OpenBufL = "$00"
DEFINE OpenBufH = "$05"

BYTE ARRAY copy_right(0) =
    "(c) PSC-ACTION! (parts by A.C.S)"

; Primitive IO routines
PROC Clos=*(BYTE d)[$FFA2$A686$CA0$AD0]

PROC Outputq=*(BYTE d,BYTE ARRAY s)
[$A684$BA0$4D0]
 
PROC In=*(BYTE d,BYTE ARRAY s)
[$A684$5A0$A586$A2$0$A386]

PROC XIOstr=*(BYTE d,x,c,a1,a2,BYTE ARRAY s)
[$A0A$A0A$98AA$9D$342$A3A5$AF0$9D$34A$A4A5$9D$34B$A9$0$9DA8$349
$A5B1$9D$348$12F0$18$A5A5$169$9D$344$A6A5$69$0$9D$345$4C$E456$60]

PROC Opn=*(BYTE d,BYTE ARRAY s,BYTE m,o)
[$A586$A684$3A0$4CXIOstr]

PROC Prt=*(BYTE d,BYTE ARRAY s)
[$A586$A684$A2$0$A386$9A0$20XIOstr$AD0$BA9$9D$342$9BA9$4C$E456$60]

PROC Error(BYTE err)[$6C$A$0$1113$8301]

PROC Break=*()
[$BA$8E$4C1$80A0$98$4C Error]


; math library routines
PROC LShift=*()
[$84A4$AF0$8586$A$8526$88$FAD0$85A6$60]

PROC RShift=*()
[$84A4$AF0$8586$8546$6A$88$FAD0$85A6$60]

PROC SetSign=*()[$D3A4$1010]
PROC SS1=*()
[$8685$8786$38$A9$0$86E5$A8$A9$0$87E5$AA$98$60]

PROC SMOps=*()
[$D386$E0$0$310$20SS1$8285$8386$85A5$E10$AA$D345$D385
$84A5$20SS1$8485$8586$A9$0$8785$60]

PROC MultB=*()
[$1BF0$CA$C786$AA$15F0$C686$A9$0$8A2$A$C606$290$C765$CA$F6D0
$18$8765$8785$86A5$87A6$60]

PROC MultI=*()
[$20SMOps$82A6$1BF0$C686$84A6$15F0$CA$C786
$8A2$A$8726$C606$690$C765$290$87E6$CA$F0D0
$8685$82A5$85A6$20MultB$83A5$84A6$20MultB$4CSetSign]

PROC DivI=*()
[$20SMOps$85A5$27F0
$8A2$8226$8326$8726$38$83A5$84E5$A8$87A5$85E5$490
$8785$8384$CA$E7D0$82A5$2A$A2$0$83A4$8684$4CSetSign
$10A2$8226$8326$2A$4B0$84C5$390$84E5$38$CA$EFD0
$8226$8326$8685$82A5$83A6$4CSetSign]

PROC RemI=*()[$20 DivI$86A5$87A6$60]

PROC SArgs=*()
[$A085$A186$A284$18$68$8485$369$A8$68$8585$69$0$48$98$48$1A0
$84B1$8285$C8$84B1$8385$C8$84B1
$A8$B9$A0$0$8291$88$F810$11A5$FD0$11E6$4C Break$6308$1109$1819$2113$3323$60]

SET $4E4=LShift
SET $4E6=RShift
SET $4E8=MultI
SET $4EA=DivI
SET $4EC=RemI
SET $4EE=SArgs

PROC ChkErr=*(BYTE r,b,eC)[$1610$88C0$8F0
$98$80C0$11F0
$4C Error$8A$4A4A$4A4A$98AA$9D EOF$60]

PROC Break1=*(BYTE err)
[$1A2$1186$48$20 Break$68$A8$60]

PROC Open=*(BYTE d,BYTE ARRAY f,BYTE m,a2)
[$48$A186$A284$A8$A9$0$99 EOF$A8$A1B1$8D OpenBuf $A8$C8$9BA9$2D0$A1B1$99 OpenBuf $88$F8D0
$68$A2 OpenBufL $A0 OpenBufH $20Opn$4C ChkErr]

PROC PrintE=*(BYTE ARRAY s)[$A186$AA$A1A4$A5device]
PROC PrintDE=*(BYTE d,BYTE ARRAY s)
[$20 Prt$4C ChkErr]

PROC Close=*(BYTE d)[$20 Clos$4C ChkErr]

PROC Print=*(BYTE ARRAY s)[$A186$AA$A1A4$A5device]
PROC PrintD=*(BYTE d,BYTE ARRAY s)
[$20Outputq$4C ChkErr]

PROC InS=*()
[$20In$A084$BD$348$3F0$38$1E9$A0$0$A591$A0A4$60]

PROC InputS=*(BYTE ARRAY s)[$A286$AA$A2A4$A5device]
PROC InputSD=*(BYTE d,BYTE ARRAY s)[$48$FFA9$A385$68]
PROC InputMD=*(BYTE d,BYTE ARRAY s,BYTE m)
[$48$A186$A284$A0$0$A3A5$A191$68$A2A4]
PROC InputD=*(BYTE d,BYTE ARRAY s)[$20InS$4C ChkErr]

BYTE FUNC GetD=*(BYTE d)[$7A2]
PROC CCIO=*()
[$A486$A0A$A0A$AA$A4A5$9D$342$A9$0$9D$348$9D$349
$98$20$E456$A085$4C ChkErr]

PROC PutE=*()[$A9$9B]
PROC Put=*(BYTE c)[$AA$A5device]
PROC PutD=*(BYTE d,BYTE c)[$A186$A1A4]
PROC PutD1=*()[$BA2$4C CCIO]

PROC PutDE=*(BYTE dev)[$A0$9B$F7D0]

PROC XIO=*(BYTE d,f,c,a1,a2,BYTE ARRAY s)
[$20XIOstr$4C ChkErr]

PROC CToStr=*()
[$D485$D586$20$D9AA$20$D8E6$FFA0$A2$0$C8$E8
$F3B1$9D$550$F710$8049$9D$550$8E$550$60]

PROC PrintB=*(BYTE n)[$A2$0]
PROC PrintC=*(CARD n)[$20 CToStr$A5device]
PROC PNum=*()[$50A2$5A0$20 Outputq$4C ChkErr]

PROC PrintBE=*(BYTE n)[$A2$0]
PROC PrintCE=*(CARD n)[$20PrintC$4CPutE]

PROC PrintBD=*(BYTE d, n)[$A0$0]
PROC PrintCD=*(BYTE d, CARD n)
[$A085$8A$A284$A2A6$20 CToStr$A0A5$4CPNum]

PROC PrintBDE=*(BYTE n)[$A0$0]
PROC PrintCDE=*(BYTE d,CARD n)
[$20PrintCD$A0A5$4CPutDE]

BYTE FUNC InputB=*()
CARD FUNC InputC=*()
INT FUNC InputI=*()
[$A5 device]
BYTE FUNC InputBD=*(BYTE d)
CARD FUNC InputCD=*(BYTE d)
INT FUNC InputID=*(BYTE d)
[$13A2$8E$550$50A2$5A0$20InputD$50A9$5A2]

MODULE

BYTE CIO_status

CHAR FUNC CIOQ=*(BYTE dev, CARD addr,
          size, BYTE cmd, aux1, aux2)
[$29$F$85$A0$86$A1$A$A$A$A$AA$A5$A5
$9D$342$A5$A3$9D$348$A5$A4$9D$349
$A5$A6$F0$8$9D$34A$A5$A7$9D$34B$98
$9D$345$A5$A1$9D$344$20$E456
$8C CIO_status$C0$88$D0$6$98$A4$A0
$99 EOF$A085$60]

CARD FUNC Bget=*(BYTE dev,
                    CARD addr, size)
[$48$A9$7$85$A5$A9$0$85$A6$A5$A3$5$A4
$D0$6$85$A0$85$A1$68$60$68$20 CIOQ
$BD$348$85$A0$BD$349$85$A1$60]

MODULE ; for user

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

CARD comtab=$0A

BYTE errnum

PROC Dosin ()

 [ $6C $0C $00 ]

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)

BYTE FUNC Sparta ()

  BYTE r = [1]
  BYTE POINTER bp

  bp = comtab
  IF bp^ # $4C THEN
   r = 0
  FI

RETURN (r)

PROC ZCRNAME=$1356 () ; DUMMY

PROC GetCRNAME(BYTE ARRAY s)
  BYTE i

  i=1
  DO
   s(i)=Peek(comtab+32+i)
   i==+1
  UNTIL s(i-1)=$9B
  OD
  s(0)=i-2
RETURN

PROC GetCRPar(BYTE ARRAY s)
  BYTE i
  i=1
  DO
   s(i)=Peek(comtab+35+i)
   i==+1
  UNTIL s(i-1)=$9B
  OD
  s(0)=i-2
RETURN

PROC Err (BYTE num)
 errnum = num
RETURN

PROC Main()

 BYTE ARRAY fn(20)
 BYTE ARRAY st(40)
 BYTE ARRAY ds(120)
 BYTE ARRAY s(255)
 BYTE fnd = [0]
 BYTE di
 CARD si
 Error=Err

 IF Sparta()=0 THEN
   Print ("Filename: ")
   InputS (fn)
   PutE ()
   Print ("Searchstring: ")
   InputS (st)
 ELSE
   ZCRNAME=comtab+3
   ZCRNAME()
   GetCRNAME(fn)
   ZCRNAME()
   GetCRPar(st)
 FI
 
 Open (1,fn, 4, 0)
 errnum = 0

 DO
  BGet (1,s+1,200)
  s(0)=200

  si = 1

  DO
   fnd = 0
   ds(di)=s(si)
   si==+1
   di==+1

   IF s(si)=13%s(si)=155 THEN
     ds(0)=di-1
     di=1      
     IF s(si)=13 THEN
      si==+1
     FI
     si==+1
    
     fnd = Find(st,ds)
     IF fnd THEN
       PrintE(ds)
     FI
   FI
  UNTIL si > 200
  OD 
 UNTIL errnum#0
 OD
 Close (1) 

RETURN