Assign EXISTS
Příklad co porovnává seznam zařízeni a který jsem si upravil sice funguje skvěle, ale obsahuje pár věcí o kterých nevím jak fungujou. To prostě nejde a nemůžu to zabudovat když nevim o co jde.
Například bitový posun shift left (Shl nebo <<). Na internetech jsem si přečetl co to dělá a pod, ale furt nevim kde, proč a jak tuhle funkci použít

Minulej tejden jsem se bavil se zákazníkem a ten říkal že programuje skoro 20 let a tohle použil asi dvakrát

Mezitím jsem vylepšil způsob ověření pomocí AmigaDos příkazu jak navrhoval Falcon_11.
Tady je příklad s porvnáváním zařízení.
Code:
MODULE 'dos/dosextens'
PROC main()
DEF jo
WriteF('0 existuje, 20 neexistuje\n')
jo:=findAssign('ram disk:')
WriteF('cislo \d\n',jo)
ENDPROC
PROC findAssign(name:PTR TO CHAR)
/* returns 0 if it exists otherwise it returns 20 */
DEF db:PTR TO doslibrary
DEF rootnode:PTR TO rootnode
DEF dosinfo:PTR TO dosinfo
DEF devicelist:PTR TO devlist
DEF temp[256]:STRING
DEF temp2[256]:STRING
DEF i=0
StrCopy(temp,name)
WHILE temp[i] ->hleda dvojtecku ve stringu
IF(temp[i]=":")
SetStr(temp,i) ->zapise do stringu to co je pred dvojteckou
i:=-1
ENDIF
EXIT i=-1
i++
ENDWHILE
IF i<>-1 THEN RETURN 20 ->kdyz chybi dvojtecka
db:= dosbase
rootnode:= db.root
dosinfo:= (rootnode.info << 2)
devicelist:= (dosinfo.devinfo << 2)
Forbid()
WHILE(devicelist.next)
bStrC(devicelist.name,temp2)
IF(strCmpi(temp2,temp,ALL))
Permit()
RETURN 0
ENDIF
devicelist:=(devicelist.next << 2)
ENDWHILE
Permit()
ENDPROC 20
PROC strCmpi(test1:PTR TO CHAR, test2:PTR TO CHAR, len)
/* case insensitive string compare */
DEF i,l1,l2
IF len=ALL
l1:= StrLen(test1)
l2:= StrLen(test2)
IF l1<>l2 THEN RETURN FALSE
len:= l1
ENDIF
FOR i:=0 TO len-1
IF charToLower(test1[i])<>charToLower(test2[i]) THEN RETURN FALSE
ENDFOR
ENDPROC TRUE
PROC charToLower(c)
DEF str[1]:STRING
str[0]:=c
LowerStr(str)
ENDPROC str[0]
PROC bStrC(bstr:PTR TO CHAR,outbuf:PTR TO CHAR)
DEF str:PTR TO CHAR
DEF loop,counter
counter:= 0
str:= (bstr << 2)
SetStr(outbuf,str[0])
FOR loop:= 1 TO str[0]
outbuf[counter]:= str[loop]
counter++
ENDFOR
ENDPROC
Komentovat