/* Le fichier lit_map.c contient les routines de lecture écriture de * la table de clavier */ #include "edimap.h" #include "func.h" #define HUNK_HEADER 0x3f3 #define HUNK_CODE 0x3e9 #define HUNK_RELOC32 0x3ec #define HUNK_END 0x3f2 #define TAILLE0_OFF 0x14 #define CODE_OFF 0x18 #define TAILLE1_OFF 0x1c #define FIX_OFF 0x20 #define AdNOM_OFF 0x0c #define AdTABLE_OFF 0x0eL #define LKM 0x12 #define STR_OFF 0x2a4 /*----------------------------------------------------*/ /* on a dans un buffer filebuf le fichier table de clavier qui a été chargé * et qui a pour longueur taille */ lit_table() { ULONG *plong, code_size, pKeybase, longtab, nb_str, *deb_p_str; UWORD *pword; plong = (ULONG *)filebuf; if (*plong++ != HUNK_HEADER) return ERROR; if (*plong++ != 0L) return ERROR; if (*plong++ != 1L) return ERROR; plong = (ULONG *)(filebuf+CODE_OFF); if (*plong++ != HUNK_CODE) return ERROR; code_size = *plong++; /* taille du hunk en LONG */ pbase = (UBYTE *)(plong); pword = (UWORD *)(pbase + AdNOM_OFF); /*printf("pnom %lx",*pword);*/ pnom = (UBYTE *)(pbase + *(pword++)); ++pword; /*printf("pword %lx,ad lkmt %x\n",pword,*pword);*/ keymap.km_LoKeyMapTypes = (UBYTE *)(pbase + *pword++); ++pword; keymap.km_LoKeyMap = (ULONG *)(pbase + *pword++); ++pword; keymap.km_LoCapsable = (UBYTE *)(pbase + *pword++); ++pword; keymap.km_LoRepeatable = (UBYTE *)(pbase + *pword++); ++pword; keymap.km_HiKeyMapTypes = (UBYTE *)(pbase + *pword++); ++pword; keymap.km_HiKeyMap = (ULONG *)(pbase + *pword++); ++pword; keymap.km_HiCapsable = (UBYTE *)(pbase + *pword++); ++pword; keymap.km_HiRepeatable = (UBYTE *)(pbase + *pword); /*printf("pbase= %lx\n",pbase);*/ longtab = code_size * 4; plong += code_size; if (*plong++ != HUNK_RELOC32) return ERROR; /* pnb_str = (ULONG *)(pbase + longtab + 4);*/ nb_str = *plong++; if (*plong++ != 0L) return ERROR; deb_p_str = plong; /*printf("longtab %lx, nb_str %lx\n",longtab, nb_str);*/ /*printf("pnb_str %lx,deb_p_str %lx\n",pnb_str,deb_p_str);*/ pKeybase = (UBYTE *)(keymap.km_LoKeyMap) - pbase; init_p(deb_p_str,nb_str,pKeybase,buffer); return BON; } /*--------------------------------*/ /* initialise la table des strings */ void init_p(p,nb,keybase,t) ULONG *p, /* debut de la table d'adresses a reloger */ nb, /* nb d'adresses a reloger */ keybase; /* position dans le fichier du debut des keys */ struct P_String *t; /* buffer des strings de taille P_SIZE (128) */ { int key, i; for(i=0; i<(nb-9); i++) { key = (*p - keybase)/4; /* numero de la touche concernee */ t[key].p = (UBYTE *)(*(APTR)(pbase + *p++)) ; /*off de l'adr du str */ buf_p[key].p = (ULONG)t[key].p + pbase; /* adr du str */ t[key].l = (UBYTE)key; /* numero de la touche */ } t = tri(t,P_SIZE); /* on tri par numero */ for (key = 1; t[key].l; key++) { buf_p[t[key-1].l].l = t[key].p - t[key-1].p; } buf_p[t[key-1].l].l = (UBYTE *)(pnom - pbase) - t[key-1].p; } /*--------------------------------*/ /* tri des adresses de strings */ struct P_String *tri(t,nb) struct P_String *t; int nb; { struct P_String pr; int i, ip, j, ik, l; ip = --nb; /* décremente pour garder 0 a la fin */ while (ip >= 2) { ip /= 2; j = 0; ik = nb - ip; while (j < ik) { i = j; while (i >= 0) { l = i + ip; if (t[i].p <= t[l].p) break; pr = t[i]; t[i] = t[l]; t[l] = pr; i -= ip; } j++; } } while (!(t->p)) t++; return(t); } /*--------------------------------------------*/ /* Création sur disque de la nouvelle table */ ecr_table(new_nom,new_table) char *new_nom, *new_table; { struct FileHandle *fout; ULONG *t_reloc; ULONG l_nom, l, wpnom; int i, l_reloc; UBYTE *p_byte, *pbase; if ((fout = Open(new_nom,MODE_NEWFILE)) == NULL) { printf("Je ne peux ouvrir le fichier %s\n",new_nom); return ERROR; } pbase = filebuf + FIX_OFF; Write(fout,filebuf,78L); /* ecrit le meme debut que l'on modifiera */ /* le bloc qui suit est inutile car le même en fait */ /* mise_a_jour = 46L; Seek(fout,mise_a_jour,OFFSET_BEGINNING) p_byte = keymap.km_LoKeyMapTypes - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_LoKeyMap - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_LoCapsable - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_LoRepeatable - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_HiKeyMapTypes - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_HiKeyMap - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_HiCapsable - pbase; Write(fout,p_byte,4L); p_byte = keymap.km_HiRepeatable - pbase; */ t_reloc = (ULONG *)buffer; /* reutilise buffer */ l_reloc = ajust_table(t_reloc); Write(fout,keymap.km_LoCapsable,8L); Write(fout,keymap.km_HiCapsable,7L); Write(fout,keymap.km_LoRepeatable,8L); Write(fout,keymap.km_HiRepeatable,7L); Write(fout,keymap.km_LoKeyMapTypes,64L); Write(fout,keymap.km_HiKeyMapTypes,56L); Write(fout,keymap.km_LoKeyMap,256L); Write(fout,keymap.km_HiKeyMap,224L); for (i=0; i