#define USE_TI89 // Produce .89z File #define USE_TI92PLUS // Produce .89z File //#define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization #define SAVE_SCREEN // Save/Restore LCD Contents #define SET_FILE_IN_USE_BIT //#define DEBUG_ON #include #include "Langues.h" #define FICHIER_MODEL "main\\model" #define fini even=1; ER_throwVar(1); #define CHAINE_VERSION "Fast Editor Version 15.8" TEXT_EDIT te = {NULL, 0, {0, 0, 0, 0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0}}; char contin=0, enreg=1, copy=0, bak=0, modified=0; int HEIGHT, WIDTH; HANDLE han, exec_handle; char *buffer; static unsigned short saveauto=500, savecnt; unsigned char numloop=0; static unsigned char mode=0; static unsigned long nexec=0; volatile int counter, idles; unsigned short offs; unsigned char even; static char Pastes[4][52]; static short resulte=0; short keywait() { while (!kbhit()) idle(); return ngetchx(); } void TE_pasteChar (char c,TEXT_EDIT *te) { char str[2] = {c, 0}; TE_pasteText (te, str, 1); } void Paste(unsigned char texte) { TE_pasteChar(texte,&te); } void About() { char buf[50]; sprintf (buf, EXECUTE, nexec); HANDLE handle = DialogNewSimple (120, 36); DialogAddTitle (handle, A_PROPOS, BT_NONE, BT_NONE); DialogAddText (handle, 3, 14, CHAINE_VERSION); DialogAddText (handle, 3, 20, "(C) 2003 Florian Brönnimann"); DialogAddText (handle, 3, 26, buf); DialogDo (handle, CENTER, CENTER, NULL, NULL); HeapFree(handle); } /*void Paste_menu() { FILE *f; short result; if ((f=fopen("cb","rt"))==NULL) return; HANDLE handle; handle = PopupNew ("Coller", 46); char buffer[1010]; short n=1; //printf("Salut"); ngetchx(); while (fgets(buffer,1000,f)!=NULL) { //printf("Salut"); ngetchx(); buffer[strlen(buffer)-1]=0; PopupAddText (handle, -1, buffer, n++); } fclose(f); result = PopupDo (handle, CENTER, CENTER, n-1); HeapFree(handle); if (!result) return; n=1; f=fopen("cb","rt"); while (fgets(buffer,1000,f)!=NULL && n++=16432 && k<=16441) result = k-16412; // else if (k>=16440) // result=k-16408; else { char *scrtmp=malloc(LCD_SIZE); LCD_save(scrtmp); BitmapPut (0, 0, buffer, ScrRect, A_REPLACE); result = -2; result = MenuKey (exec_handle, k); LCD_restore(scrtmp); free(scrtmp); } if (result>=6) { if (result>=7 && result<=20) { ST_modKey(ST_NONE); modified=1; } unsigned char c=0; switch (result){ case 7 : c=169; break; case 8 : c=92; break; case 9 : c=151; break; case 10: c=215; break; case 11: c=12; break; case 12: c=36; break; case 13: c=27; break; case 21: enreg=1; fini; break; case 22: contin=1;enreg=0; fini; break; case 23: contin=1; fini; break; case 24: copy=1; fini; break; case 25: bak=1; fini; break; case 26: About(); break; case 27: enreg=0; fini; break; case 28: Copy_menu(); break; case 29: Paste_menu(); break; } if (result>=7 && result<=13) Paste(c); } return result; } void affstatline(char arg) { ScrRectFill (&(SCR_RECT){{0, HEIGHT-5, 136, HEIGHT-1}}, &(SCR_RECT){{0, HEIGHT-5, 136, HEIGHT-1}}, 0); FontSetSys(0); if (HeapAvail()>15000) printf_xy (0,HEIGHT-5,"%03lu ko",HeapAvail()/1000-15); else printf_xy (0,95,"DECU"); if (arg==0) { if (mode==0) printf_xy (62,HEIGHT-5,"%05u car.", te.CurSize); if (mode==1) printf_xy (70,HEIGHT-5,"%#04.1f %%", (float) te.CurSize*100/32768); } else DrawStr(0,HEIGHT-5,PATIENTEZ,4); } /*void CB_addTEXT() { HANDLE h; unsigned long len; if (CB_fetchTEXT(&h,&len)==FALSE) return; FILE *f; if (len>1000) return; char buffer[1010]; memcpy(buffer,HeapDeref(h),len); buffer[len]=0; f=fopen("cb","a"); fputs(strcat(buffer,"\n"),f); fclose(f); } */ void EventHandler (EVENT *ev) // Support d'événements, on laisse au TIOS faire l'analyse des touches { //et retourner ses valeurs pour une copatibilité avec les 2 calculatrices. (Sinon y'a des inversions) short k = 0, result=0; short i; char str[4]; even=1; unsigned char *p; if (ev->Type == CM_KEYPRESS) {//si (le type d'évenement == un appui de touche) k = ev->extra.Key.Code; //on intercepte la valeur et la stocke dans k if (k!=257 && k!=264 && (k<337 || k>344) && k!=263 && HeapAvail()<10000) { ERD_dialog(670,FALSE); goto end; } if (k==267 || k==264 || k==277) { //C'est à ca que ca sert d'intercepter les touches, if (modified) Enreg(); fini; //faire quitter l'éditeur en cas de [ON] [ESC] ou [HOME] } p=HeapDeref(te.Text.h)+te.CursorOffset; if (*(p-1)==169) { if (k>='a' && k<='z') k-=32; } if (*(p-2)==169 || *(p-1)==27 || *(p-1)==36) { if (k=='v') k='0'; else if (k>='q' && k<='s') k-=64; else if (k>='l' && k<='n') k-=56; else if (k>='g' && k<='i') k-=48; } if (k==16428) k=','; else if (k==16557) k='.'; ev->extra.Key.Code=k; //Ci-dessous, il faut empêcher le TIOS d'analyser ces touches. Donc ne pas les passer à Event //Sinon c'est le plantage (principalement à cause de la mémoire) //if ( k==278 || k==266 || k==265 || k==4147 || k==4373 || k==4141 || (k>=16652 && k<=16656)) even=0; if (k==266 || k==278) { result=k; i=0; k=48; while (k>=48 && k<=57 && i<3) str[i++]=(k=ngetchx()); i=atoi(str); ev->extra.Key.Code=0; if (result==278) ev->extra.Key.Code=i; else saveauto=5*i; if (ev->extra.Key.Code==0) ev->Type=CM_IDLE; } if (k==258) { TE_pasteText(&te,"\\t",2); ev->Type=CM_IDLE; } if (k==265) { even=0; mode=1-mode; } if ((k>=16652 && k<=16656) || k==4141 || k==4361 || k==16649) even=0; if (k>=16433 && k<=16442) { result=exe_menu(k); even=0; } //Et là on a une touche de menus [F1 à F6], on saute donc au prog correspondant qui gère tout ça if ((k>=268 && k<=270)) { result=exe_menu(k); even=0; } //Rechercher if (result==35) { even=1; CU_stop(); ev->Type = CM_MENU_FIND; } if ((k && k<=263) || k==20480 || k==16648) { modified=1; savecnt++; } } if (even) { if (!TE_handleEvent (&te, ev)) EV_defaultHandler (ev); } if (result==29) TE_focus(&te); if (k==16651 || k==4363) { OSInitKeyInitDelay(60); OSInitBetweenKeyDelay(30); } /* if (k==24576 && aj_pp) { CB_addTEXT(); } */ if (savecnt>saveauto && saveauto) { savecnt=0; if (DlgMessage(NULL,SAUVE_ALERT,3,5)==13) { contin=1; ER_throwVar(1); } } end: if (k) affstatline(0); } char *mk_nam(char *str) { static char name[19] = {0} ; short len = strlen(str) ; if (len > 17) return NULL ; return strcpy(name+1, str)+len ; } void _main() { if (HeapAvail()<10000) { ERD_dialog(670,FALSE); return; //Etat mémoire CRITIQUE! } buffer=malloc(500); OSInitKeyInitDelay(90); //Déréglage touches! OSInitBetweenKeyDelay(30); char *base_addr; //Adresse de la base de la variable à éditer char *str; //Chaine (nom du texte) char refaire; ESI argptr=top_estack; //Pour récupérer les arguments refaire=0; idles=0; SYM_ENTRY *sym, *sym2; char str2[30]="romtxt\\\0", *stra, *strtemp, *strok; short archived; HEIGHT=LCD_HEIGHT, WIDTH=LCD_WIDTH; WinFont(DeskTop,1); if (GetArgType(argptr)!=45) goto findefin; str=GetSymstrArg(argptr); //On prend l'arg comme une chaine. Si ce n'était //pas une chaine, on aurait eu un pointeur erroné et donc un bô plantage! /* f = fopen ("str", "wb"); //Ouverture du fichier: STR fputc (0, f); //Maintenant la variable BASIC str contient sous fputs (str, f); //forme de chaine du TIOS le nom de la variable fputc (0, f); //comme ca je pourrai utiliser #str comme en BASIC fputc (STR_TAG, f); //pour des opérations TI-BASIC. Trop bô! fclose (f); //Et voilà, c'est terminé. */ sym = SymFindPtr (str, 0); //Entrée symbole TRY if (sym) //Si le texte, eh ben il existe, cmd_copyvar(str,$(bak)); //On a ensuite une variable bak qui permettra en sens inverse de faire un backup. else { //for (z=0;z<3;z++) { //3 fois car ca marche jamais du premier coup :) TRY cmd_copyvar(mk_nam((char*)FICHIER_MODEL),str); cmd_copyvar(str,$(bak)); ONERR DlgMessage(ERREUR,ERR_MODEL,1,0); ER_throwVar(1); ENDTRY //ST_showHelp("Création du texte..."); //C'est vrai ça? //} } argptr=top_estack; strtemp=GetStrnArg(argptr); strok=strtemp; for (stra=strtemp;*stra;stra) if (*stra++=='\\') strok=stra; strcat(str2,strok); stra=mk_nam(str2); // OldInt5 = GetIntVec (AUTO_INT_5); // SetIntVec (AUTO_INT_5, MyInt5); han = MenuNew (2, 240, 18); //Un petit menu... MenuAddText (han, 0, "Menu", 1, 0); //Toutes MenuAddText (han, 0, "Format", 2, 0); //les MenuAddText (han, -1, RECHERCHER, 35, 0); //options MenuAddText (han, 1, QUIT_SAUV, 21, 0); //une MenuAddText (han, 1, ANNULER, 22, 0); //à MenuAddText (han, 1, ENREGISTRER, 23, 0); //une MenuAddText (han, 1, COPIE, 24, 0); //... MenuAddText (han, 1, BACKUP, 25, 0); MenuAddText (han, 1, A_PROPOS, 26, 0); MenuAddText (han, 1, QUIT_SSAUV, 27, 0); MenuAddText (han, 1, COPIER_PP, 28, 0); MenuAddText (han, 1, COLLER_PP, 29, 0); MenuAddText (han, 2, FORMAT, 7, 0); MenuAddText (han, 2, CARACT, 8, 0); MenuAddText (han, 2, COMMANDES, 9, 0); MenuAddText (han, 2, COMMENTAIRES, 10, 0); MenuAddText (han, 2, PAGEBREAK, 11, 0); MenuAddText (han, 2, MACROS, 12, 0); MenuAddText (han, 2, STYLES, 13, 0); exec_handle = MenuBegin (HLock (han), 0, 0, 0); //On démarre le menu BitmapGet (&(SCR_RECT){{0,0,239,15}}, buffer); //On prend le haut du menu DeskTop->Clip.xy.y0 = 0; DeskTop->Clip.xy.y1 = 127; ONERR ERD_dialog(errCode,FALSE); goto findefin; ENDTRY TRY debu: affstatline(1); //Var link: str CHN 12 refaire=0; nexec++; //Nombre d'EXECutions sym = SymFindPtr ($(bak), 0); //On recherche le fichier dans la VAT // Au début on doit enlever les déchets au début de la variable TEXT // parce que l'éditeur de textes s'attend à ce que ce soit le cas base_addr = HeapDeref (sym->handle); //Voilà, on a maintenant l'adresse de la variable offs=peek_w(base_addr+2); //Avant de supprimer le début de la variable, on prend l'offset du curseur pour éviter qu'il se retrouve toujours au tout début du texte memmove (base_addr, base_addr + 4, peek_w(base_addr)); //Et la on supprime les 4 premiers octets de la variable //WinClr (DeskTop); //Effacement de la fenêtre principale, DeskTop. // DrawLine(0,0,239,0,0); ScrRectFill (&(SCR_RECT){{0, 0, 239, HEIGHT-7}}, ScrRect, 0); //Rectangle sur tout l'écran // ClrScr(); // ScrRectFill (&(SCR_RECT){{0, 100, 239, 128}}, ScrRect, 0); //Pour les 92+ // ScrRectFill (&(SCR_RECT){{160, 0, 239, 99}}, ScrRect, 0); //Ca aussi //DrawLine(0,93,239,93,1); //Ligne de la status line TE_open (&te, DeskTop, MakeWinRect (-8, 1, WIDTH-1, HEIGHT-11), sym->handle, offs, 0, 7); CU_start (); affstatline(0); EV_captureEvents (EventHandler); modified=0; savecnt=0; TRY EV_eventLoop (); ONERR EV_captureEvents (NULL); ENDTRY affstatline(1); // Ici c'est l'enregistrement pur, faut vachement bien connaitre le format des // fichiers TEXT pour ca! sym = SymFindPtr ($(bak), 0); base_addr = HeapDeref (HeapRealloc (sym->handle, te.CurSize + 10)); //Allocation, on a besoin de BEAUCOUP de mémoire! memmove (base_addr + 4, base_addr, te.CurSize); //Enregistrement du texte poke_w (base_addr, te.CurSize + 4); //Taille de la variable poke_w (base_addr + 2, te.CursorOffset); //L'endroit ou se trouve le curseur poke (base_addr + te.CurSize + 4,0); //Fin de la variable poke (base_addr + te.CurSize + 5, TEXT_TAG); //Type: TEXT sym2 = SymFindPtr (str, 0); archived=sym2->flags.bits.archived; if (enreg==1) { EM_moveSymFromExtMem(str,HS_NULL); SymDel(str); SymMove($(bak),str); if (archived) EM_moveSymToExtMem(str,HS_NULL); } SymDel($(bak)); cmd_copyvar(str,$(bak)); enreg=1; refaire=0; if (contin || copy || bak) refaire=1; contin=0; if (copy) { copy=0; EM_moveSymFromExtMem(stra,HS_NULL); cmd_copyvar(str,stra); EM_moveSymToExtMem(stra,HS_NULL); } if (bak) { bak=0; TRY EM_moveSymFromExtMem(str,HS_NULL); cmd_copyvar(stra,str); cmd_copyvar(str,$(bak)); if (archived) EM_moveSymToExtMem(str,HS_NULL); ONERR memset(LCD_MEM,85,3840); DlgMessage (ERREUR, ERR_BACKUP, BT_OK, BT_NONE); ENDTRY } if (refaire==1) { goto debu; } SymDel($(bak)); ONERR ENDTRY MenuEnd (exec_handle); HeapUnlock (han); HeapFree (han); MenuUpdate (); // SetIntVec (AUTO_INT_5, OldInt5); findefin: OSInitKeyInitDelay(336); //Déréglage touches! OSInitBetweenKeyDelay(48); free(buffer); return; }