LIBRARY 'miko_rob.library',1,1,'bla' IS fmik_InitClass,fmk1_InitClass MODULE 'intuition/classes', 'intuition/classusr' MODULE 'utility', 'utility/hooks' MODULE 'exec/memory', 'exec/lists' ENUM ERR_MEM=1, ERR_OPEN, ERR_WRITE, ERR_LIB, ERR_STR ENUM MIKA_DUMMY = $CD410000, MIKA_DATA, MK1A_FILE, MK1A_DATA, MIKA_LEN, MIKM_DUMMY = $CD4D0000, MIKM_NewAdd, MIKM_DelEnd, /* kasuje bieūācy element */ MIKM_GetItem, /* 0 - first item !!! */ MIKM_Write, MK1M_ReadFile, MK1M_WriteFile ENUM MIKA_OFFSET_BEGIN, MIKA_OFFSET_POS, MIKA_OFFSET_END OBJECT smik_Data list, /*:PTR TO minlist,*/ miksnode, /* :PTR TO miksnode,*/ pos:LONG, len:LONG /* liczba elementów */ ENDOBJECT OBJECT smik_Node succ, /* minnode;*/ pred, ptr ENDOBJECT OBJECT smik_msgNewAdd modeid, ptr ENDOBJECT OBJECT smik_msgGetItem modeid, offset, pos ENDOBJECT /*==================================================================*/ /*==================================================================*/ OBJECT smk1_Data head /*data : PTR TO oDataMikoHead*/ ver /*: PTR TO CHAR -> copyring*/ ques /*: PTR TO CHAR*/ pics /*: PTR TO CHAR*/ song /*: PTR TO CHAR*/ samp /*: PTR TO CHAR*/ anim /*: PTR TO CHAR*/ rexx /*: PTR TO CHAR*/ ados /*: PTR TO CHAR*/ sayq /*: PTR TO CHAR*/ sayk /*: PTR TO CHAR*/ komG /*: PTR TO CHAR -> pliki z komentarzami*/ komC /*: PTR TO CHAR*/ komB /*: PTR TO CHAR*/ komg /*: PTR TO CHAR -> komentarze standardowe*/ komc /*: PTR TO CHAR*/ komb /*: PTR TO CHAR*/ usr1 /*: PTR TO CHAR*/ /* dodatkowe rozkazy */ usr2 /*: PTR TO CHAR*/ usr3 /*: PTR TO CHAR*/ lenp /* -> iloōź pozycji w pytn*/ leno /* -> iloōź pozycji w odpw*/ typtp /*: PTR TO LONG -> tablica typów pytaļ*/ typto /*: PTR TO LONG*/ lentp /*: PTR TO LONG -> tablica dīugoōci pytaļ*/ lento /*: PTR TO LONG*/ ENDOBJECT OBJECT smk1_DataMikoHead itemlen:LONG compress : CHAR x : CHAR y : CHAR z : CHAR ENDOBJECT OBJECT smk1_TypPozycji typ : LONG /*"TXTn"*/ len : LONG ENDOBJECT OBJECT smk1_Item pics /*: PTR TO CHAR ->nazwy plików do obsīugi (wyōwietlanie itp.)*/ song /*: PTR TO CHAR*/ samp /*: PTR TO CHAR*/ anim /*: PTR TO CHAR*/ rexx /*: PTR TO CHAR*/ ados /*: PTR TO CHAR*/ komg /*: PTR TO CHAR*/ komc /*: PTR TO CHAR*/ komb /*: PTR TO CHAR*/ usr1 /*: PTR TO CHAR*/ /* dodatkowe rozkazy */ usr2 /*: PTR TO CHAR*/ usr3 /*: PTR TO CHAR*/ pytn /*: PTR TO LONG -> wskaśnik do tablicy o elementach smk1_Data.lenp */ odpw /*: PTR TO LONG*/ ENDOBJECT OBJECT smk1_msgReadFile modeid, file ENDOBJECT OBJECT smk1_msgWriteFile modeid, file ENDOBJECT /* global var. */ DEF exception_info=0 /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ PROC fmik_Dispatch(cl, o, msg:PTR TO msg) DEF kod kod:=msg.methodid SELECT kod CASE OM_NEW; RETURN (fmik_New(cl, o, msg)) CASE OM_DISPOSE; RETURN (fmik_Dispose(cl, o, msg)) CASE OM_GET; RETURN (fmik_Get(cl, o, msg)) CASE MIKM_NewAdd; RETURN (fmik_NewAdd(cl, o, msg)) CASE MIKM_DelEnd; RETURN (fmik_DelEnd(cl, o, msg)) CASE MIKM_GetItem; RETURN (fmik_GetItem(cl, o, msg)) CASE MIKM_Write; RETURN (fmik_Write(cl, o, msg)) DEFAULT; RETURN (doSuperMethodA(cl, o, msg)) ENDSELECT ENDPROC FALSE PROC fmik_New(cl,o,msg) DEF data:PTR TO smik_Data, ret ret:=doSuperMethodA(cl,o,msg) data:=_INST_DATA(cl,ret) data.list:=AllocVec(SIZEOF mlh, MEMF_ANY) _NewList(data.list) data.pos:=0; data.len:=0 ENDPROC ret PROC fmik_Dispose(cl,o,msg) DEF data:PTR TO smik_Data, psmik_Node:PTR TO smik_Node, pmlh:PTR TO mlh data:=_INST_DATA(cl,o) pmlh:=data.list psmik_Node:=pmlh.head WHILE psmik_Node.succ data.miksnode:=psmik_Node doMethodA(o,[MIKM_DelEnd,0]) psmik_Node:=data.miksnode ENDWHILE FreeVec(data.list) ENDPROC doSuperMethodA(cl,o,msg) PROC fmik_NewAdd(cl,o,msg:PTR TO smik_msgNewAdd) DEF data:PTR TO smik_Data, psmik_Node:PTR TO smik_Node data:=_INST_DATA(cl,o) psmik_Node:=AllocVec(SIZEOF smik_Node, MEMF_ANY) psmik_Node.ptr:=msg.ptr Insert(data.list,psmik_Node,data.miksnode) data.miksnode:=psmik_Node data.pos:=data.pos+1 data.len:=data.len+1 /* WriteF('max:\d\n',data.len)*/ ENDPROC o /*==============================*/ /* Usuwa wėzeī w liōcie */ /* i zwraca wskaśnik do danych */ /*==============================*/ PROC fmik_DelEnd(cl,o,msg) DEF data:PTR TO smik_Data, psmik_Node:PTR TO smik_Node, ptr data:=_INST_DATA(cl,o) psmik_Node:=data.miksnode ptr:=psmik_Node.ptr psmik_Node:=psmik_Node.succ Remove(data.miksnode) FreeVec(data.miksnode) data.miksnode:=psmik_Node data.len:=data.len-1 IF data.pos > data.len THEN data.pos:=0 ENDPROC ptr PROC fmik_Get(cl,o,msg:PTR TO opget) DEF data:PTR TO smik_Data, id, addr:PTR TO LONG data:=_INST_DATA(cl,o) /* WriteF('data:\h\n',data)*/ id:=msg.attrid addr:=msg.storage SELECT id CASE MIKA_DATA; addr[]:=data; RETURN TRUE CASE MIKA_LEN; addr[]:=data.len; RETURN TRUE DEFAULT; RETURN doSuperMethodA(cl, o, msg) ENDSELECT ENDPROC PROC fmik_GetItem(cl, o, msg:PTR TO smik_msgGetItem) DEF data:PTR TO smik_Data, psmik_Node:PTR TO smik_Node,p1smik_Node:PTR TO smik_Node, pmlh:PTR TO mlh, i data:=_INST_DATA(cl,o) pmlh:=data.list psmik_Node:=pmlh.head p1smik_Node:=pmlh.head IF msg.offset=MIKA_OFFSET_BEGIN FOR i:=0 TO msg.pos-1 psmik_Node:=psmik_Node.succ IF psmik_Node.succ = NIL THEN psmik_Node:=p1smik_Node ENDFOR ELSEIF msg.offset=MIKA_OFFSET_POS psmik_Node:=data.miksnode IF msg.pos>=0 FOR i:=0 TO msg.pos-1 psmik_Node:=psmik_Node.succ IF psmik_Node.succ = NIL THEN psmik_Node:=p1smik_Node ENDFOR ELSE FOR i:=0 TO msg.pos+1 STEP -1 psmik_Node:=psmik_Node.pred IF psmik_Node.pred = NIL THEN psmik_Node:=p1smik_Node ENDFOR ENDIF ELSEIF msg.offset=MIKA_OFFSET_END pmlh:=data.list psmik_Node:=pmlh.tailpred FOR i:=0 TO msg.pos-1 psmik_Node:=psmik_Node.pred IF psmik_Node.pred = NIL THEN psmik_Node:=p1smik_Node ENDFOR ENDIF data.miksnode:=psmik_Node RETURN psmik_Node.ptr ENDPROC PROC fmik_Write(cl, o, msg) DEF data:PTR TO smik_Data, psmik_Node:PTR TO smik_Node, pmlh:PTR TO mlh data:=_INST_DATA(cl,o) WriteF('len:\d\n',data.len) pmlh:=data.list psmik_Node:=pmlh.head WHILE psmik_Node.succ WriteF('\d\n',psmik_Node.ptr) psmik_Node:=psmik_Node.succ ENDWHILE ENDPROC PROC fmik_InitClass() DEF pClass=NIL:PTR TO iclass IF utilitybase = NIL THEN utilitybase:=OpenLibrary('utility.library',37) pClass:=MakeClass(NIL, 'rootclass', NIL, SIZEOF smik_Data,0) installhook(pClass.dispatcher, {fmik_Dispatch}) ENDPROC pClass /*==================================================================*/ /*==================================================================*/ PROC fmk1_Dispatch(cl:PTR TO iclass, o, msg:PTR TO msg) DEF id id:=msg.methodid SELECT id CASE OM_NEW; RETURN fmk1_New(cl, o, msg) CASE OM_DISPOSE; RETURN fmk1_Dispose(cl, o, msg) CASE MK1M_ReadFile; RETURN fmk1_ReadFile(cl, o, msg) CASE MK1M_WriteFile;RETURN fmk1_WriteFile(cl, o, msg) CASE MIKM_NewAdd; RETURN fmk1_NewAdd(cl, o, msg) CASE MIKM_DelEnd; RETURN fmk1_DelEnd(cl, o, msg) CASE MIKM_Write; RETURN fmk1_Write(cl, o, msg) /* CASE MKM_NewItem; RETURN miNewItem(cl, o, msg) CASE MKM_Write; RETURN miWrite(cl, o, msg) CASE MKM_EndItem; RETURN miEndItem(cl, o, msg) CASE MIM_WriteFile; RETURN miWriteFile(cl, o, msg) */ DEFAULT; RETURN doSuperMethodA(cl, o, msg) ENDSELECT ENDPROC /*==================================================================*/ PROC fmk1_New(cl,o,msg:PTR TO opset) HANDLE DEF data:PTR TO smk1_Data, msgData:PTR TO smk1_Data, ret,i ret:=doSuperMethodA(cl,o,msg) msgData:=GetTagData(MK1A_DATA, 0, msg.attrlist) data:=_INST_DATA(cl, ret) IF msgData data.head:=New(SIZEOF smk1_DataMikoHead) CopyMem(msgData.head, data.head,SIZEOF smk1_DataMikoHead) data.ver :=newandadd(msgData.ver ) data.ques:=newandadd(msgData.ques) data.pics:=newandadd(msgData.pics) data.song:=newandadd(msgData.song) data.samp:=newandadd(msgData.samp) data.anim:=newandadd(msgData.anim) data.rexx:=newandadd(msgData.rexx) data.ados:=newandadd(msgData.ados) data.sayq:=newandadd(msgData.sayq) data.sayk:=newandadd(msgData.sayk) data.komG:=newandadd(msgData.komG) data.komC:=newandadd(msgData.komC) data.komB:=newandadd(msgData.komB) data.komg:=newandadd(msgData.komg) data.komc:=newandadd(msgData.komc) data.komb:=newandadd(msgData.komb) data.usr1:=newandadd(msgData.usr1) data.usr2:=newandadd(msgData.usr2) data.usr3:=newandadd(msgData.usr3) data.lenp:=msgData.lenp data.leno:=msgData.leno IF data.lenp data.typtp:=New(data.lenp*4) data.lentp:=New(data.lenp*4) CopyMem(msgData.typtp, data.typtp, (data.lenp*4)) CopyMem(msgData.lentp, data.lentp, (data.lenp*4)) ELSE data.typtp:=NIL; data.lentp:=NIL ENDIF IF data.leno data.typto:=New(data.leno*4) data.lento:=New(data.leno*4) CopyMem(msgData.typto, data.typto, (data.leno*4)) CopyMem(msgData.lento, data.lento, (data.leno*4)) ELSE data.typto:=NIL; data.lento:=NIL ENDIF ELSE i:=((SIZEOF smk1_Data)/4)-1 MOVE.L i, D0 MOVE.L #0, D1 MOVE.L data, A0 loop: CLR.L (A0)+ ADDI #1, D1 CMP D1, D0 BNE loop /* FOR i:=0 TO ((SIZEOF smk1_Data)/4)-1 CopyMem([0], data+i, 4) ENDFOR */ ENDIF Raise(0) EXCEPT IF exception THEN ret:=doMethodA(ret, [OM_DISPOSE, NIL]) jaki_ERR() ENDPROC ret /*==================================================================*/ PROC fmk1_Dispose(cl:PTR TO iclass, o, msg:PTR TO msg) DEF data:PTR TO smk1_Data,return data:=_INST_DATA(cl, o) IF data.ver <> NIL THEN DisposeLink(data.ver) IF data.ques <> NIL THEN DisposeLink(data.ques) IF data.pics <> NIL THEN DisposeLink(data.pics) IF data.song <> NIL THEN DisposeLink(data.song) IF data.samp <> NIL THEN DisposeLink(data.samp) IF data.anim <> NIL THEN DisposeLink(data.anim) IF data.rexx <> NIL THEN DisposeLink(data.rexx) IF data.ados <> NIL THEN DisposeLink(data.ados) IF data.sayq <> NIL THEN DisposeLink(data.sayq) IF data.sayk <> NIL THEN DisposeLink(data.sayk) IF data.komG <> NIL THEN DisposeLink(data.komG) IF data.komC <> NIL THEN DisposeLink(data.komB) IF data.komB <> NIL THEN DisposeLink(data.komB) IF data.komg <> NIL THEN DisposeLink(data.komg) IF data.komc <> NIL THEN DisposeLink(data.komc) IF data.komb <> NIL THEN DisposeLink(data.komb) IF data.usr1 <> NIL THEN DisposeLink(data.usr1) IF data.usr2 <> NIL THEN DisposeLink(data.usr2) IF data.usr3 <> NIL THEN DisposeLink(data.usr3) IF data.typtp <> NIL THEN Dispose(data.typtp) IF data.typto <> NIL THEN Dispose(data.typto) IF data.lentp <> NIL THEN Dispose(data.lentp) IF data.lento <> NIL THEN Dispose(data.lento) IF data.head <> NIL THEN Dispose(data.head) return := doSuperMethodA(cl, o, msg) ENDPROC return /*==================================================================*/ PROC fmk1_ReadFile(cl,o,msg:PTR TO smk1_msgReadFile) HANDLE DEF data:PTR TO smk1_Data, plik,fh, len, headMain[28]:STRING, lenHead:PTR TO LONG, head=NIL, body=NIL, ptr:PTR TO LONG, ptrt:PTR TO LONG, ptrl:PTR TO LONG DEF pyt=TRUE, i, j, def:PTR TO CHAR,lendef, itempomoc:smk1_TypPozycji,pos, oItem: PTR TO smk1_Item, psmk1_DataMikoHead:PTR TO smk1_DataMikoHead data:=_INST_DATA(cl,o) IF (plik:=msg.file)=NIL THEN _Throw(ERR_STR,'Brak specyfikacji pliku\n') IF ((len:=FileLength(plik))<=NIL) OR ((fh:=Open(plik,OLDFILE))=NIL) THEN _Throw(ERR_OPEN,plik) Read(fh, headMain, 28) /* wczytanie nagīówka */ IF StrCmp(headMain,'MiKO',4) = NIL THEN _Throw(ERR_STR,'Zīy nagīówek pliku') IF ((ptr := szukaj4char(headMain, headMain+20, 'DANE')) = FALSE) THEN _Throw(ERR_STR,'Brak nagīówka "DANE"') len:=SIZEOF smk1_DataMikoHead /* dī. structury */ data.head:=New(len) CopyMem(ptr+8,data.head,len) /* przerzut caīej structury */ lenHead:=ptr[1] /* dīugoōź nagīówka od 'DANE' */ head:= New(lenHead) Read(fh,head, lenHead) /* wczytanie nagīówka */ IF ((ptr := szukaj4char(head, head+lenHead, 'DEFI')) = FALSE) THEN _Throw(ERR_STR,'Zīa definicja elementów w pliku') lendef:=ptr[1] /* dīugoōź definicji elementów */ def:=ptr+8 /* 'DEFI' + LONG */ FOR i:=0 TO lendef-1 STEP 8 /* Nazywamy pozycje po imieniu */ CopyMem(def+i,itempomoc,8) /* itempomoc:smk1_TypPozycji */ IF StrCmp(itempomoc,'ODPW',4) pyt:=FALSE data.leno:=itempomoc.len data.typto:=New(data.leno*4) data.lento:=New(data.leno*4) ptrt:=data.typto /* ptr to tablica typów */ ptrl:=data.lento /* ptr to tablica dīugoōci */ ELSEIF StrCmp(itempomoc,'PYTN',4) pyt:=TRUE data.lenp:=itempomoc.len data.typtp:=New(data.lenp*4) data.lentp:=New(data.lenp*4) ptrt:=data.typtp ptrl:=data.lentp ELSE IF pyt ptrt[]++:=itempomoc.typ; ptrl[]++:=itempomoc.len; ELSE ptrt[]++:=itempomoc.typ; ptrl[]++:=itempomoc.len; ENDIF ENDIF ENDFOR data.ver := znajdziwpisz('VER:', '\n', head, head+lenHead) data.ques := znajdziwpisz('QUES', '\n', head, head+lenHead) data.pics := znajdziwpisz('PICS', '\n', head, head+lenHead) data.song := znajdziwpisz('SONG', '\n', head, head+lenHead) data.samp := znajdziwpisz('SAMP', '\n', head, head+lenHead) data.anim := znajdziwpisz('ANIM', '\n', head, head+lenHead) data.rexx := znajdziwpisz('REXX', '\n', head, head+lenHead) data.ados := znajdziwpisz('ADOS', '\n', head, head+lenHead) data.sayq := znajdziwpisz('SAYQ', '\n', head, head+lenHead) data.sayk := znajdziwpisz('SAYK', '\n', head, head+lenHead) data.komG := znajdziwpisz('KOMG', '\n', head, head+lenHead) data.komC := znajdziwpisz('KOMC', '\n', head, head+lenHead) data.komB := znajdziwpisz('KOMB', '\n', head, head+lenHead) data.komg := znajdziwpisz('KOMg', '\n', head, head+lenHead) data.komc := znajdziwpisz('KOMc', '\n', head, head+lenHead) data.komb := znajdziwpisz('KOMb', '\n', head, head+lenHead) data.usr1 := znajdziwpisz('USR1', '\n', head, head+lenHead) data.usr2 := znajdziwpisz('USR2', '\n', head, head+lenHead) data.usr3 := znajdziwpisz('USR3', '\n', head, head+lenHead) IF (ptr := szukaj4char(head, head+lenHead, 'BODY')) = FALSE THEN _Throw(ERR_STR,'Brak nagīówka "BODY"') len:=ptr[1] /* dī. danych */ ptr:=ptr+8 /* 'BODY' + LONG */ body:= New(len) pos:=(ptr-head)+28 /* pozycja odczytu */ Seek(fh,pos,-1) /* OFFSET_BEGINNING = -1*/ Read(fh, body, len) Close(fh) /* koniec operacji na pliku */ oItem:=New(SIZEOF smk1_Item) oItem.pytn:=New(data.lenp*4) oItem.odpw:=New(data.leno*4) ptr:=body psmk1_DataMikoHead:=data.head FOR i:=1 TO psmk1_DataMikoHead.itemlen /* iloōź elementów */ IF (ptr := szukaj4char(ptr, ptr+100, 'ITEM')) <> FALSE len:=ptr[1] /* dīugoōź definicji elementu */ def:=ptr+8 /* 'ITEM' + LONG */ oItem.pics:= znajdziwpisz('PICS', '\n', def, def+len) oItem.song:= znajdziwpisz('SONG', '\n', def, def+len) oItem.samp:= znajdziwpisz('SAMP', '\n', def, def+len) oItem.anim:= znajdziwpisz('ANIM', '\n', def, def+len) oItem.rexx:= znajdziwpisz('REXX', '\n', def, def+len) oItem.ados:= znajdziwpisz('ADOS', '\n', def, def+len) oItem.komg:= znajdziwpisz('KOMg', '\n', def, def+len) oItem.komc:= znajdziwpisz('KOMc', '\n', def, def+len) oItem.komb:= znajdziwpisz('KOMb', '\n', def, def+len) oItem.usr1:= znajdziwpisz('USR1', '\n', def, def+len) oItem.usr2:= znajdziwpisz('USR2', '\n', def, def+len) oItem.usr3:= znajdziwpisz('USR3', '\n', def, def+len) ENDIF ptr:=ptr+8+len /* przeskok przez definicje */ FOR j:=0 TO data.lenp-1 /* pytanka */ ptrt:=oItem.pytn /* oItem.pytn::PTR TO (PTR TO CHAR) */ ptrl:=data.lentp ptrt[j]:=readTo(ptr,'\n',ptrl[j]) /* Czytamy liniė */ ptr:=ptr+StrLen(ptrt[j])+1 /* Nastėpna linia */ ENDFOR FOR j:=0 TO data.leno-1 ptrt:=oItem.odpw /* odpowiedzi */ ptrl:=data.lento ptrt[j]:=readTo(ptr,'\n',ptrl[j]) ptr:=ptr+StrLen(ptrt[j])+1 ENDFOR doMethodA(o, [MIKM_NewAdd, oItem]) /* Start metoda dodajāca do listy */ ENDFOR Raise(0) EXCEPT IF head <> NIL THEN Dispose(head) IF body <> NIL THEN Dispose(body) IF oItem.pytn THEN Dispose(oItem.pytn) IF oItem.odpw THEN Dispose(oItem.odpw) IF oItem THEN Dispose(oItem) IF exception o:=doMethodA(o, [OM_DISPOSE, NIL]) jaki_ERR() RETURN NIL ENDIF ENDPROC o /*==================================================================*/ PROC fmk1_WriteFile(cl:PTR TO iclass, o, msg:PTR TO smk1_msgWriteFile) HANDLE DEF data:PTR TO smk1_Data, psmk1_Item:PTR TO smk1_Item, buffor, fh=NIL, lenfull=0, lenitem, i, j, ptr:PTR TO CHAR, ptrl:PTR TO LONG, ptrt:PTR TO LONG, body,item, typek: smk1_TypPozycji, len, psmk1_DataMikoHead:PTR TO smk1_DataMikoHead data:=_INST_DATA(cl,o) GetAttr(MIKA_LEN, o, {lenitem}) lenfull:=12+(SIZEOF smk1_DataMikoHead)+8 /*->DATA*/ lenfull:=lenfull+((data.lenp+data.leno)*8) +24 /*->DEFI*/ lenfull:=lenfull+dajlen(data.ver) lenfull:=lenfull+dajlen(data.ques) lenfull:=lenfull+dajlen(data.pics) lenfull:=lenfull+dajlen(data.song) lenfull:=lenfull+dajlen(data.samp) lenfull:=lenfull+dajlen(data.anim) lenfull:=lenfull+dajlen(data.rexx) lenfull:=lenfull+dajlen(data.ados) lenfull:=lenfull+dajlen(data.sayq) lenfull:=lenfull+dajlen(data.sayk) lenfull:=lenfull+dajlen(data.komG) lenfull:=lenfull+dajlen(data.komC) lenfull:=lenfull+dajlen(data.komB) lenfull:=lenfull+dajlen(data.komg) lenfull:=lenfull+dajlen(data.komc) lenfull:=lenfull+dajlen(data.komb) lenfull:=lenfull+dajlen(data.usr1) lenfull:=lenfull+dajlen(data.usr2) lenfull:=lenfull+dajlen(data.usr3) lenfull:=lenfull+8+1 /*-> BODY*/ body:=lenfull psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_BEGIN,0,NIL]) FOR i:=0 TO lenitem-1 lenfull:=lenfull+8 /*-> ITEM*/ lenfull:=lenfull+dajlen(psmk1_Item.pics) /*->nazwy plików do obsīugi (wyōwietlanie itp.)*/ lenfull:=lenfull+dajlen(psmk1_Item.song) lenfull:=lenfull+dajlen(psmk1_Item.samp) lenfull:=lenfull+dajlen(psmk1_Item.anim) lenfull:=lenfull+dajlen(psmk1_Item.rexx) lenfull:=lenfull+dajlen(psmk1_Item.ados) lenfull:=lenfull+dajlen(psmk1_Item.komg) lenfull:=lenfull+dajlen(psmk1_Item.komc) lenfull:=lenfull+dajlen(psmk1_Item.komb) lenfull:=lenfull+dajlen(psmk1_Item.usr1) lenfull:=lenfull+dajlen(psmk1_Item.usr2) lenfull:=lenfull+dajlen(psmk1_Item.usr3) ptrl:=psmk1_Item.pytn FOR j:=0 TO data.lenp-1 lenfull:=lenfull+StrLen(ptrl[j])+1 ENDFOR ptrl:=psmk1_Item.odpw FOR j:=0 TO data.leno-1 lenfull:=lenfull+StrLen(ptrl[j])+1 /*-> +'\n'*/ ENDFOR psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_POS,1,NIL]) ENDFOR /* WriteF('dīugoōź pliku : \d\n',lenfull)*/ buffor:=New(lenfull) ptr:=buffor typek.typ:="MiKO"; typek.len:=lenfull-8; CopyMem(typek,ptr,8); ptr:=ptr+8 CopyMem('TEST',ptr,4);ptr:=ptr+4 typek.typ:="DANE"; typek.len:=body-12-16 /*->-MiKO-DATA*/ CopyMem(typek,ptr,8); ptr:=ptr+8 psmk1_DataMikoHead:=data.head psmk1_DataMikoHead.itemlen:=lenitem CopyMem(data.head,ptr,SIZEOF smk1_DataMikoHead); ptr:=ptr+(SIZEOF smk1_DataMikoHead) typek.typ:="DEFI"; typek.len:=(data.lenp+data.leno)*8+16 CopyMem(typek,ptr,8); ptr:=ptr+8 typek.typ:="PYTN"; typek.len:=data.lenp CopyMem(typek,ptr,8); ptr:=ptr+8 ptrt:=data.typtp; ptrl:=data.lentp FOR j:=0 TO data.lenp-1 typek.typ:=ptrt[j]; typek.len:=ptrl[j] CopyMem(typek,ptr,8); ptr:=ptr+8 ENDFOR typek.typ:="ODPW"; typek.len:=data.leno CopyMem(typek,ptr,8); ptr:=ptr+8 ptrt:=data.typto; ptrl:=data.lento FOR j:=0 TO data.leno-1 typek.typ:=ptrt[j]; typek.len:=ptrl[j] CopyMem(typek,ptr,8); ptr:=ptr+8 ENDFOR CopyMem('$VER:',ptr,5); ptr:=ptr+5 CopyMem(data.ver,ptr,i:=StrLen(data.ver)); ptr:=ptr+i CopyMem('\n',ptr,1); ptr := ptr+1 ptr:=przepisz('QUES', data.ques, ptr) ptr:=przepisz('PICS', data.pics, ptr) ptr:=przepisz('SONG', data.song, ptr) ptr:=przepisz('SAMP', data.samp, ptr) ptr:=przepisz('ANIM', data.anim, ptr) ptr:=przepisz('REXX', data.rexx, ptr) ptr:=przepisz('ADOS', data.ados, ptr) ptr:=przepisz('SAYQ', data.sayq, ptr) ptr:=przepisz('SAYK', data.sayk, ptr) ptr:=przepisz('KOMG', data.komG, ptr) ptr:=przepisz('KOMC', data.komC, ptr) ptr:=przepisz('KOMB', data.komB, ptr) ptr:=przepisz('KOMg', data.komg, ptr) ptr:=przepisz('KOMc', data.komc, ptr) ptr:=przepisz('KOMb', data.komb, ptr) ptr:=przepisz('USR1', data.usr1, ptr) ptr:=przepisz('USR2', data.usr2, ptr) ptr:=przepisz('USR3', data.usr3, ptr) typek.typ:="BODY"; typek.len:=lenfull-body CopyMem(typek,ptr,8); ptr:=ptr+8 psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_BEGIN,0,NIL]) FOR i:=0 TO lenitem-1 typek.typ:="ITEM"; item:=ptr CopyMem(typek,ptr,8); ptr:=ptr+8 ptr:=przepisz('PICS', psmk1_Item.pics, ptr) ptr:=przepisz('SONG', psmk1_Item.song, ptr) ptr:=przepisz('SAMP', psmk1_Item.samp, ptr) ptr:=przepisz('ANIM', psmk1_Item.anim, ptr) ptr:=przepisz('REXX', psmk1_Item.rexx, ptr) ptr:=przepisz('ADOS', psmk1_Item.ados, ptr) ptr:=przepisz('KOMg', psmk1_Item.komg, ptr) ptr:=przepisz('KOMc', psmk1_Item.komc, ptr) ptr:=przepisz('KOMb', psmk1_Item.komb, ptr) ptr:=przepisz('USR1', psmk1_Item.usr1, ptr) ptr:=przepisz('USR2', psmk1_Item.usr2, ptr) ptr:=przepisz('USR3', psmk1_Item.usr3, ptr) typek.typ:="ITEM"; typek.len:=ptr-item-8 CopyMem(typek,item,8); ptrl:=psmk1_Item.pytn FOR j:=0 TO data.lenp-1 CopyMem(ptrl[j], ptr, len:=StrLen(ptrl[j])); ptr:=ptr+len CopyMem('\n',ptr,1); ptr := ptr+1 ENDFOR ptrl:=psmk1_Item.odpw FOR j:=0 TO data.leno-1 CopyMem(ptrl[j], ptr, len:=StrLen(ptrl[j]));ptr:=ptr+len CopyMem('\n',ptr,1); ptr := ptr+1 ENDFOR psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_POS,1,NIL]) ENDFOR IF (fh:=Open(msg.file,NEWFILE))=NIL THEN _Throw(ERR_OPEN,msg.file) IF (Write(fh,buffor,lenfull)) <> lenfull THEN _Throw(ERR_WRITE,msg.file) Raise(0) EXCEPT IF fh THEN Close(fh) IF buffor THEN Dispose(buffor) jaki_ERR() ENDPROC PROC przepisz(head,str:PTR TO CHAR, ptr) DEF len IF str IF (len:=StrLen(str)) CopyMem(head,ptr,4); ptr:=ptr+4 CopyMem(str,ptr,len); ptr:=ptr+len CopyMem('\n',ptr,1); ptr := ptr+1 ENDIF ENDIF ENDPROC ptr PROC dajlen(text:PTR TO CHAR) DEF wynik=0 IF text IF (wynik:=StrLen(text)) THEN wynik:=wynik+5 ELSE RETURN FALSE ELSE RETURN FALSE ENDIF ENDPROC wynik /*==================================================================*/ PROC fmk1_NewAdd(cl,o,msg:PTR TO smik_msgNewAdd) HANDLE DEF data:PTR TO smk1_Data, psmk1_Item: PTR TO smk1_Item, p1smk1_Item: PTR TO smk1_Item, i, ptr0:PTR TO LONG, ptr1:PTR TO LONG data:=_INST_DATA(cl,o) psmk1_Item:=New(SIZEOF smk1_Item) p1smk1_Item:=msg.ptr psmk1_Item.pics:=newandadd(p1smk1_Item.pics) psmk1_Item.song:=newandadd(p1smk1_Item.song) psmk1_Item.samp:=newandadd(p1smk1_Item.samp) psmk1_Item.anim:=newandadd(p1smk1_Item.anim) psmk1_Item.rexx:=newandadd(p1smk1_Item.rexx) psmk1_Item.ados:=newandadd(p1smk1_Item.ados) psmk1_Item.komg:=newandadd(p1smk1_Item.komg) psmk1_Item.komc:=newandadd(p1smk1_Item.komc) psmk1_Item.komb:=newandadd(p1smk1_Item.komb) psmk1_Item.usr1:=newandadd(p1smk1_Item.usr1) psmk1_Item.usr2:=newandadd(p1smk1_Item.usr2) psmk1_Item.usr3:=newandadd(p1smk1_Item.usr3) psmk1_Item.pytn:=newandadd(p1smk1_Item.pytn) psmk1_Item.odpw:=newandadd(p1smk1_Item.odpw) psmk1_Item.pytn:=New(data.lenp*4) ptr0:=psmk1_Item.pytn ptr1:=p1smk1_Item.pytn FOR i:=0 TO data.lenp-1 ptr0[i]:=newandadd(ptr1[i]) ENDFOR psmk1_Item.odpw:=New(data.leno*4) ptr0:=psmk1_Item.odpw ptr1:=p1smk1_Item.odpw FOR i:=0 TO data.leno-1 ptr0[i]:=newandadd(ptr1[i]) ENDFOR o:=doSuperMethodA(cl, o, [MIKM_NewAdd, psmk1_Item]) EXCEPT jaki_ERR() ENDPROC o /*==================================================================*/ PROC fmk1_DelEnd(cl,o,msg) DEF data:PTR TO smk1_Data, psmk1_Item: PTR TO smk1_Item, i, ptr0:PTR TO LONG data:=_INST_DATA(cl,o) psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_BEGIN,0,NIL]) psmk1_Item:=doSuperMethodA(cl, o, [MIKM_DelEnd, NIL]) IF psmk1_Item.pics THEN DisposeLink(psmk1_Item.pics) IF psmk1_Item.song THEN DisposeLink(psmk1_Item.song) IF psmk1_Item.samp THEN DisposeLink(psmk1_Item.samp) IF psmk1_Item.anim THEN DisposeLink(psmk1_Item.anim) IF psmk1_Item.rexx THEN DisposeLink(psmk1_Item.rexx) IF psmk1_Item.ados THEN DisposeLink(psmk1_Item.ados) IF psmk1_Item.komg THEN DisposeLink(psmk1_Item.komg) IF psmk1_Item.komc THEN DisposeLink(psmk1_Item.komc) IF psmk1_Item.komb THEN DisposeLink(psmk1_Item.komb) IF psmk1_Item.usr1 THEN DisposeLink(psmk1_Item.usr1) IF psmk1_Item.usr2 THEN DisposeLink(psmk1_Item.usr2) IF psmk1_Item.usr3 THEN DisposeLink(psmk1_Item.usr3) IF psmk1_Item.pytn THEN DisposeLink(psmk1_Item.pytn) IF psmk1_Item.odpw THEN DisposeLink(psmk1_Item.odpw) IF psmk1_Item.pytn ptr0:=psmk1_Item.pytn FOR i:=0 TO data.lenp-1 IF ptr0[i] THEN DisposeLink(ptr0[i]) ENDFOR Dispose(psmk1_Item.pytn) ENDIF IF psmk1_Item.odpw ptr0:=psmk1_Item.odpw FOR i:=0 TO data.leno-1 IF ptr0[i] THEN DisposeLink(ptr0[i]) ENDFOR Dispose(psmk1_Item.odpw) ENDIF ENDPROC /*==================================================================*/ PROC fmk1_Write(cl, o, msg) DEF data:PTR TO smk1_Data, i, j, len, psmk1_Item:PTR TO smk1_Item, leno, lenp, ptr:PTR TO LONG data:=_INST_DATA(cl,o) GetAttr(MIKA_LEN,o,{len}) leno:=data.leno lenp:=data.lenp psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_BEGIN,0,NIL]) FOR i:=0 TO len-1 WriteF('item nr \d\n',i) ptr:=psmk1_Item.pytn FOR j:=0 TO lenp-1 WriteF('\s\n',ptr[j]) ENDFOR ptr:=psmk1_Item.odpw FOR j:=0 TO leno-1 WriteF('\s\n',ptr[j]) ENDFOR psmk1_Item:=doMethodA(o, [MIKM_GetItem, MIKA_OFFSET_POS,1,NIL]) ENDFOR ENDPROC /*==================================================================*/ PROC fmk1_InitClass(cl) DEF pClass=NIL:PTR TO iclass pClass:=MakeClass(NIL, NIL, cl, SIZEOF smk1_Data,0) installhook(pClass.dispatcher, {fmk1_Dispatch}) ENDPROC pClass /*==================================================================*/ PROC znajdziwpisz(co, do, poczatek, koniec ) DEF ptr :PTR TO LONG IF (ptr := szukaj4char(poczatek, koniec, co)) <> FALSE RETURN readTo(ptr+4,do,100) ELSE RETURN NIL ENDIF ENDPROC PROC newandadd(surc) DEF dest IF surc dest:=String(StrLen(surc)) StrCopy(dest,surc,ALL) ELSE dest:=NIL ENDIF ENDPROC dest /*-----------------------------------------------------------------------*/ PROC szukaj4char(poczatek:PTR TO CHAR, koniec, poszukiwanychar) IF poczatek=NIL THEN Raise("mem") WHILE poczatek < koniec IF StrCmp( poczatek, poszukiwanychar,4) RETURN poczatek ENDIF poczatek++ ENDWHILE RETURN FALSE ENDPROC /*-----------------------------------------------------------------------*/ PROC readTo(mem:PTR TO CHAR,wzor,max) DEF len_wzor, i=0, wynik IF wynik = NIL THEN RETURN FALSE len_wzor:=StrLen(wzor) IF len_wzor=0 wynik:=String(StrLen(mem)) ELSE WHILE (i++<=max) AND (StrCmp(mem+i-1, wzor, len_wzor)=FALSE) ENDWHILE wynik:=String(i-StrLen(wzor)) ENDIF StrCopy(wynik,mem,ALL) ENDPROC wynik /*-----------------------------------------------------------------------*/ /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ /*==================================================================*/ PROC main() ENDPROC /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* =================== =================*/ /* =================== P R O C E D U R K I =================*/ /* =================== =================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ /* ==================================================================*/ PROC _INST_DATA(cl:PTR TO iclass, o) ENDPROC ((o)+(cl.instoffset AND $FFFF)) PROC installhook(hook,func) DEF return MOVE.L hook,A0 MOVE.L func,12(A0) LEA hookentry(PC),A1 MOVE.L A1,8(A0) MOVE.L A4,16(A0) MOVE.L A0,return ENDPROC return hookentry: MOVEM.L D2-D7/A2-A6,-(A7) MOVE.L 16(A0),A4 MOVE.L A0,-(A7) MOVE.L A2,-(A7) MOVE.L A1,-(A7) MOVE.L 12(A0),A0 JSR (A0) LEA 12(A7),A7 MOVEM.L (A7)+,D2-D7/A2-A6 RTS PROC doMethodA( obj:PTR TO object, msg:PTR TO msg ) DEF h:PTR TO hook, o:PTR TO object, dispatcher IF obj o := obj-SIZEOF object /* instance data is to negative offset */ h := o.class dispatcher := h.entry /* get dispatcher from hook in iclass */ MOVEA.L h,A0 MOVEA.L msg,A1 MOVEA.L obj,A2 /* probably should use CallHookPkt, but the */ MOVEA.L dispatcher,A3 /* original code (DoMethodA()) doesn't. */ JSR (A3) /* call classDispatcher() */ MOVE.L D0,o RETURN o ENDIF ENDPROC NIL PROC doSuperMethodA( cl:PTR TO iclass, obj:PTR TO object, msg:PTR TO msg ) DEF h:PTR TO hook, o:PTR TO object, dispatcher IF obj AND cl o := obj-SIZEOF object /* instance data is to negative offset */ h := cl.super dispatcher := h.entry /* get dispatcher from hook in iclass */ MOVEA.L h,A0 MOVEA.L msg,A1 MOVEA.L obj,A2 /* probably should use CallHookPkt, but the */ MOVEA.L dispatcher,A3 /* original code (DoMethodA()) doesn't. */ JSR (A3) /* call classDispatcher() */ MOVE.L D0,o RETURN o ENDIF ENDPROC NIL PROC _NewList(list:PTR TO mlh) list.head := list+4 /* {list.tail} */ list.tail := NIL list.tailpred := list /* {list.head} */ ENDPROC PROC _Throw(id,exc_info) exception_info:=exc_info Raise(id) ENDPROC PROC jaki_ERR() DEF e[5]:ARRAY, s[250]:STRING IF exception WriteF('Program caused exception: ') IF exception<10000 SELECT exception CASE ERR_MEM; StringF(s,'no memory') CASE ERR_OPEN; StringF(s,'could not open file \s',IF exception_info THEN exception_info ELSE '') CASE ERR_WRITE; StringF(s,'Bīėdy podczas nagrywania pliku \s',IF exception_info THEN exception_info ELSE '') CASE ERR_LIB; StringF(s,'could not open \s',IF exception_info THEN exception_info ELSE '') CASE ERR_STR; StringF(s,'\s',IF exception_info THEN exception_info ELSE '') /*-> and others...*/ DEFAULT; StringF(s,'\d\n',exception) ENDSELECT ELSE SELECT exception CASE "MEM"; StringF(s,'no memory\n') CASE "OPEN"; StringF(s,'could not open file \s\n',IF exception_info THEN exception_info ELSE '') CASE "^C"; StringF(s,'***BREAK') CASE "GURU"; StringF(s,'GURU nr \h',exception_info) /*-> and others...*/ DEFAULT e[4]:=0 ^e:=exception WHILE e[]=0 DO e++ WriteF('"\s" ',e) WriteF(IF exception_info<1000 THEN '[\d]\n' ELSE '[\h]\n',exception_info) ENDSELECT ENDIF WriteF('\s\n',s) ENDIF ENDPROC VOID '$VER: MiKO.lib v0.01 1996.0000'