; Header File ; Created 14/10/2004; 15:53:10 match_key: ;<- a2.l pointeur dans le texte en cours ;-> d0 = 1 clé recherchée, 0 sinon ;-> a0.l pointe alors vers la valeur de la clé move.l a1,-(a7) move.l a4,a1 move.l a2,a0 bsr white_spaces moveq #0,d0 \loop: cmp.b (a1)+,(a0)+ beq \loop tst.b -(a1) bne \skip subq.l #1,a0 bsr white_spaces cmp.b #'=',(a0)+ bne \skip moveq #1,d0 \skip: move.l (a7)+,a1 rts white_spaces: \loop: cmp.b #' ',(a0)+ beq \loop subq.l #1,a0 rts next_key: ;<- a2.l pointeur dans le texte en cours ;-> a2.l actualisé vers la prochaine clé ;-> a0.l = 0 si pas de clé suivante ;d'abord skipper les commentaires clr.b _section_is_changed movem.l a1/a2,-(a7) move.l a2,a0 bsr white_spaces cmp.b #'#',(a0) beq \next_key_comment cmp.b #13,(a0) beq \next_key_line cmp.b #'[',(a0) beq \next_key_section bsr is_valid_key move.l a0,d0 beq \error \key_num: move.l a0,a2 bsr is_valid_num move.l a0,d0 bne \exit \key_string: move.l a2,a0 bsr is_valid_string move.l a0,d0 bne \exit \error: suba.l a0,a0 \exit: movem.l (a7)+,a2/a1 rts \next_key_line: tst.b 1(a0) beq \error addq.l #2,a0 bra \exit \next_key_comment: \loop: tst.b (a0) beq \exit cmp.b #13,-2(a0) beq \exit addq.l #1,a0 bra \loop rts \next_key_section: move.l a0,a1 bsr is_valid_section cmp.w #17,d0;pour vérifier la taille du nom de section bgt \error movem.l a0-a2,-(a7) lea _current_section(pc),a0 lea _section_is_changed(pc),a2 move.b #1,(a2)+ addq.l #1,a1 \copy_section_name: cmp.b #']',(a1) beq \end_copy_section_name move.b (a1)+,(a0)+ bra \copy_section_name \end_copy_section_name: clr.b (a0) lea _current_section(pc),a0 lea _section(pc),a1 \cmp_section: tst.b (a0) beq \same_sections cmp.b (a0)+,(a1)+ bne \different_sections bra \cmp_section \same_sections: move.b #1,(a2) bra \end_sections \different_sections: cmp.b #1,(a2) beq \skip clr.b (a2) bra \end_sections \skip: move.b #2,(a2);-> on passe de la bonne à une mauvaise \end_sections: movem.l (a7)+,a0-a2 bra \exit is_valid_section: ; string valide [[][_|a-z|A-Z][_|a-z|A-Z|0-9]*[]] ;<- a0.l pointeur vers la clé actuelle ;-> a0.l pointeur vers la clé suivante, ou vers 0 si le texte est fini cmp.b #'[',(a0) bne \error addq.l #1,a0 moveq #0,d0 cmp.b #'_',(a0) beq \ok cmp.b #'A',(a0) blt \error cmp.b #'Z',(a0) ble \ok cmp.b #'a',(a0) blt \error cmp.b #'z',(a0) bgt \error \ok: \loop: addq.l #1,a0 addq.w #1,d0 cmp.b #']',(a0) beq \exit cmp.b #'0',(a0) blt \error cmp.b #'9',(a0) ble \loop cmp.b #'_',(a0) beq \loop cmp.b #'A',(a0) blt \error cmp.b #'Z',(a0) ble \loop cmp.b #'a',(a0) blt \error cmp.b #'z',(a0) ble \loop cmp.b #'_',(a0) beq \loop bra \error \exit: addq.l #1,a0 bsr white_spaces cmp.b #13,(a0)+ bne \error tst.b (a0)+ beq \error rts \error: suba.l a0,a0 rts is_valid_string: ; string valide ["][.-[\n|\0|"]]*["][\n.|\0] ;<- a0.l pointeur vers la clé actuelle ;-> a0.l pointeur vers la clé suivante, ou vers 0 si le texte est fini ;-> a1.l pointeur vers le " du début de la chaîne bsr white_spaces moveq #0,d0 move.l a0,a1 cmp.b #'"',(a0) bne \error addq.l #1,a0 \loop: tst.b (a0) beq \error cmp.b #'"',(a0)+ bne \loop tst.b (a0) beq \exit cmp.b #13,(a0) bne \error addq.l #2,a0 bra \exit \error: suba.l a0,a0 \exit: rts is_valid_num: ; num valide [-|+|][0-9]*[\n.|\0] ;<- a0.l pointeur vers la clé actuelle ;-> a0.l pointeur vers la clé suivante, ou vers 0 si le texte est fini ;-> d0.l valeur de l'attribut movem.l d1-d2/a1,-(a7) bsr white_spaces move.l a0,a1 moveq #0,d0 cmp.b #'-',(a0) beq \ok \loop: cmp.b #'0',(a0) blt \exit cmp.b #'9',(a0) bgt \exit ;on va faire 10*d0 -> d0 move.l d0,d2 lsl.l #2,d2 add.l d2,d0 add.l d0,d0 moveq #0,d2 move.b (a0),d2 sub.b #'0',d2 ;et maintenant on a 10*d0 + d2 -> d0 add.l d2,d0 addq.l #1,d1 \ok: addq.l #1,a0 bra \loop \exit: cmp.b #'-',(a1) bne \skip_minus moveq #0,d2 sub.l d0,d2 exg.l d0,d2 \skip_minus: tst.b d1 beq \error tst.b (a0) beq \skip cmp.b #13,(a0) bne \error addq.l #2,a0 bra \skip \error: suba.l a0,a0 \skip: movem.l (a7)+,d1-d2/a1 rts is_valid_key: ;<- a0.l pointeur vers la clé actuelle ;-> a0.l pointeur vers la valeur de la clé si elle est valide ;a0 = 0 sinon ; clé valide [a-z|_|A-Z][_|a-z_|0-9|A-Z]*[ ]*[=] cmp.b #'_',(a0) beq \ok cmp.b #'A',(a0) blt \error cmp.b #'Z',(a0) ble \ok cmp.b #'a',(a0) blt \error cmp.b #'z',(a0) bgt \error \ok: \loop: addq.l #1,a0 cmp.b #' ',(a0) beq \exit cmp.b #'=',(a0) beq \exit cmp.b #'0',(a0) blt \error cmp.b #'9',(a0) ble \loop cmp.b #'_',(a0) beq \loop cmp.b #'A',(a0) blt \error cmp.b #'Z',(a0) ble \loop cmp.b #'a',(a0) blt \error cmp.b #'z',(a0) ble \loop cmp.b #'_',(a0) beq \loop bra \error \exit: bsr white_spaces cmp.b #'=',(a0)+ beq \skip \error: suba.l a0,a0 \skip rts ;******************************************************************************************************************************************************************** ;******************************************************************************************************************************************************************** ;******* ;******* GESTION DU FICHIER ;******* ;******************************************************************************************************************************************************************** ;******************************************************************************************************************************************************************** get_file: ;<- a6 nom du fichier à chercher ;-> a0.l SYM_ENTRY du fichier trouvé, d0.w handle du fichier texte trouvé ; = 0 sinon (pour d0 et a0) movem.l a1-a3/d1-d3,-(a7) move.l #kernel::SystemDir,a0 lea \symname(pc),a2 move.l a2,a3 \folder_loop: tst.b (a0) beq \folder_end move.b (a0)+,(a2)+ bra \folder_loop \folder_end: move.l a0,-(a7) move.l $67*4(a5),a0;FolderFind addq.l #4,a7 cmp.w #4,d0 bne \skip_main lea \main_sym_name(pc),a0 move.l a3,a2 bra \folder_loop \skip_main: cmp.l a3,a2 beq \skip_slash move.b #'\',(a2)+ \skip_slash: move.l a6,a0 \file_loop: tst.b (a0) beq \file_end move.b (a0)+,(a2)+ bra \file_loop \file_end: clr.b (a2) ;à ce niveau là, on a un SYM_NAME pointé par a2 qui est parfaitement valide :) ;on va pouvoir faire un SymFind pour chercher le texte ^^ clr.w -(a7) move.l a2,-(a7) move.l $283*4(a5),a0;SymFindPtr jsr (a0) addq.l #6,a7 move.l a0,d0 bne \found \not_found: moveq #10,d0 bsr alloc move.l d0,d3;pas assez de mémoire, mon fils :] beq \error bsr deref move.l #$00050001,(a0)+ move.l #$2000E000,(a0);et hop, un texte vide de fait =) move.l a2,-(a7) move.l $5C*4(a5),a0 jsr (a0);SymAdd addq.l #4,a7 tst.l d0 beq \error move.l d0,-(a7) move.l $79*4(a5),a0;DerefSym jsr (a0) addq.l #4,a7 move.w d3,12(a0) move.w d3,d0 \exit: movem.l (a7)+,a1-a3/d1-d3 rts \error_alloc: move.w d3,d0 bsr free \error: moveq #0,d0 suba.l a0,a0 bra \exit \found: move.w 12(a0),d0 beq \exit move.w d0,d3 move.l a0,a2 bsr deref moveq #0,d0 move.w (a0)+,d0 cmp.b #$E0,-1(a0,d0.l) bne \error move.l a2,a0 move.w d3,d0 bra \exit dc.b 0 \symname: ds.b 20 \main_sym_name: dc.b 'main',0 even write_section: movem.l a0-a1/d0,-(a7) lea _section_is_good(pc),a0 move.b #1,(a0) move.l a1,d0 beq \exit clr.b (a0) lea _section(pc),a0 clr.l (a0) moveq #15,d0 \loop: move.b (a1)+,(a0)+ dbra d0,\loop \exit: movem.l (a7)+,a0-a1/d0 rts