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