BOOL RTF_TW (char *source, char *destination, unsigned char format); BOOL TW_RTF (char *source, char *destination, unsigned char format); const char *AnalCaractere(unsigned char *i); #define Msg(chne) SetDlgItemText(hDlg,IDC_NOM,chne) LRESULT CALLBACK Errs(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { FILE *f; EDITSTREAM es; CHARRANGE cr; char str[10000]; static int premiereFois=1; switch (message) { case WM_INITDIALOG: es.dwError = 0; es.pfnCallback = MyRead; if (!(es.dwCookie = (DWORD) _lopen("errs.txt", OF_READ))) EndDialog(hDlg,FALSE); else { SendDlgItemMessage(hDlg,IDC_ERRS,EM_STREAMIN,SF_RTF,(LPARAM)&es); _lclose(es.dwCookie); } SendDlgItemMessage(hDlg,IDC_ERRS,EM_SETBKGNDCOLOR,0,0); return TRUE; case WM_COMMAND: if (premiereFois) { cr.cpMin=0; cr.cpMax=0; SendDlgItemMessage(hDlg,IDC_ERRS,EM_EXSETSEL,0,(LPARAM)&cr); premiereFois=0; } if (LOWORD(wParam) == IDOK || LOWORD(wParam)==IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); premiereFois=1; return TRUE; } break; } return FALSE; } #define AffErreurs() DialogBox(hInst,(LPCTSTR)IDD_ERREURS,hDlg,(DLGPROC)Errs) LRESULT CALLBACK Cvt(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR strPath[MAX_PATH] = TEXT(""); static TCHAR fichier[MAX_PATH] = TEXT(""); OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL, TEXT("Fichiers supportés\0*.89t;*.rtf\0Texte formaté\0*.rtf\0Texte TI89\0*.89t\0\0"), NULL, 0, 1, fichier, 100, NULL, 0, strPath, TEXT("Charger un fichier"), OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0, TEXT(".txt"), 0, NULL, NULL }; char *ptr; int i,j; switch (message) { case WM_INITDIALOG: SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)"RTF -> TEXT WALKER"); SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)"TEXT WALKER -> RTF"); SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)"TXTRIDER -> TEXT WALKER"); /* SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)"TEXT WALKER -> TEXTE"); SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)"TXTRIDER -> TEXT WALKER"); SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)"TEXTE -> TEXT WALKER");*/ SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_SETCURSEL,0,0); /* InitCommonControls(); GetOpenFileName(&ofn); TW_RTF (fichier, "hello.rtf",'©'); WinExec("C:\\Program Files\\Windows NT\\Accessoires\\wordpad.exe hello.rtf",1); DialogBox(hInst,(LPCTSTR)IDD_ERREURS,hDlg,(DLGPROC)Errs); EndDialog(hDlg,FALSE);*/ strcpy(fichier,gblFichier); goto fichier_choisi; return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDC_PARCOURIR) { if (GetOpenFileName(&ofn)==0) { Msg("Erreur GetOpenFileName"); break; } fichier_choisi: ptr=fichier+strlen(fichier)-4; if (strcmp(ptr,".rtf")==0 || strcmp(ptr,".RTF")==0) SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_SETCURSEL,0,0); else if (strcmp(ptr,".89t")==0 || strcmp(ptr,".89T")==0) SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_SETCURSEL,1,0); // else if (strcmp(ptr,".txt")==0 || strcmp(ptr,".TXT")==0) // SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_SETCURSEL,4,0); SetDlgItemText(hDlg,IDC_NOM,fichier); } if (LOWORD(wParam) == IDC_CONVERTIR) { Msg("Conversion en cours..."); i=SendDlgItemMessage(hDlg,IDC_COMBOSRC,CB_GETCURSEL,0,0); if (i==0) { if (!RTF_TW (fichier, "hello.89t", '©')) Msg("Conversion ratée!"); else { Msg("Conversion réussie!"); AffErreurs(); } } else if (i==1) { if (!TW_RTF (fichier, "hello.rtf", '©')) { Msg("Conversion ratée!"); AffErreurs(); } else { Msg("Conversion réussie!"); AffErreurs(); } } else if (i==2) Msg("TXTRIDER vers TEXT WALKER pas encore implémenté"); /* else if (i==2) Msg("TEXT WALKER vers TEXTE pas encore implémenté"); else if (i==3) Msg("TXTRIDER vers TEXT WALKER pas encore implémenté"); else if (i==4) Msg("TEXTE vers TEXT WALKER pas encore implémenté"); else { Msg("Cette conversion n'est pas supportée..."); break; }*/ } if (LOWORD(wParam) == IDOK || LOWORD(wParam)==IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } #define AjErreur(erreur) { erreurs++; fputs("\\par\\cf2\\b ",err); fputs(erreur,err); fputs("\n\\b0",err); } #define AjWarning(warning) { warnings++; fputs("\\par\\cf3 ",err); fputs(warning,err); fputc('\n',err); } #define AjWarningI(warning) { warnings++; fputs("\\par\\cf4 ",err); fputs(warning,err); fputc('\n',err); } #define AjInfo(info) { infos++; fputs("\\par\\cf5 ",err); fputs(info,err); fputs("\n",err); } #define AjTexte(texte) { fputs("\\par\\cf1\\i ",err); fputs(texte,err); fputs("\n\\i0",err); } #define MAX_CHAINE 100000 int infos, warnings, erreurs; #define InitFichErr(msg) { infos=erreurs=warnings=0; \ fputs("{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1036\\deflangfe036\\deftab708{\\fonttbl{\\f0\\froman\\fprq2\\fcharset0 Tahoma;}}\n",err); \ fputs("{\\colortbl ;\\red255\\green255\\blue255;\\red255\\green64\\blue64;\\red255\\green192\\blue0;\\red255\\green255\\blue64;\\red0\\green208\\blue64;}\n\\plain\\fs16\\cf1\\i ",err); \ fputs(msg,err); \ fputs("\\i0",err); \ } #define FinFichErr() { sprintf(str,"Terminé; %i Erreurs, %i Warnings",erreurs,warnings); AjTexte(str); } char cmpchn(register const char *c1,register const char *c2) { for (;*c2;c1++,c2++) { if (*c1!=*c2) return 0; } return 1; } #define ProchBalise() { i=0; while(*ptr!=' ' && *ptr!='\\' && *ptr!='\n' && *ptr && i RTF"); if (!(chn=(char*)malloc(MAX_CHAINE))) { AjErreur("ERR01: Pas pu allouer!.\n"); fclose(err); return FALSE; } if (!(src=fopen(source,"rt"))) { free(chn); AjErreur("ERR02: Fichier source non-trouvé."); fclose(err); return FALSE; } if (!(dst=fopen(destination,"wt"))) { free(chn); fclose(src); AjErreur("ERR03: Fichier destination inaccessible."); fclose(err); return FALSE; } memset(chn,0,MAX_CHAINE); fread(chn,MAX_CHAINE,1,src); if (strncmp(chn,"**TI92P*",8) && strncmp(chn,"**TI89**",8)) { AjInfo("INFO01: Fichier non-TI89 et non-TI92+. Assume que c'est un .txt!"); ptr=chn; } else ptr=chn+91; fonte=afonte=1; gras=italique=souligne=0; surligne=1; change=avertCmd=avertWordWrap=0; agras=aitalique=asouligne=0; asurligne=1; fputs("{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1036\\deflangfe036\\deftab708{\\fonttbl{\\f0\\froman\\fprq2\\fcharset0 Arial;}}\n",dst); fputs("{\\colortbl ;\\red255\\green255\\blue255;\\red0\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green127\\blue0;\\red255\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green192\\blue0;\\red128\\green0\\blue255;}\n\\plain ",dst); while(1) { if (!(*ptr)) break; if (*ptr=='³' || *ptr=='×') { //Commentaire ptr++; while(*ptr && *ptr!='³' && *ptr!='×') ptr++; if (!(*ptr)) break; continue; } if ((*ptr=='$' || (*ptr==';' && varnum==10)) && stack_ptr<10) { ptr++; if (*ptr==14) { AjInfo("INFO02: Mode redéfinition du début ($lock) non-supporté"); continue; } if (*ptr==';') { AjWarning("WARN05: Macros page par page non-supportées!"); continue; } if (varnum==0) ptrsave=ptr-1; varnum=(*ptr++)-48; if ((varnum<0 || varnum>10) && stack_ptr!=0) { varnum=0; ptr=ptrsav[--stack_ptr]; continue; } else if (varnum>=0 && varnum<=10) { if (*ptr=='=') { //Stockage dans variable vars[varnum]=++ptr; reessaye: while (*(ptr++)!=36 && *ptr); if (*ptr>=49 && *ptr<=58) goto reessaye; varnum=0; } else if (vars[varnum]) { //Collage variable (si elle existe) if (*ptr==';') { vars[10]=++ptr; while (*ptr++!=59 && *ptr); } ptrsav[stack_ptr++]=ptr; ptr=vars[varnum]; } else varnum=0; } else AjWarning("WARN04: Erreur utilisateur dans le système de macros"); continue; } if (*ptr==27) { //Shift (styles) ptr++; if (*ptr=='=') { ptr++; if (*ptr>='0' && *ptr<='9') { i=(*ptr++)-48; styles[i].fonte=fonte; styles[i].gras=gras; styles[i].italique=italique; styles[i].souligne=souligne; styles[i].surligne=surligne; } } else { if (*ptr>='0' && *ptr<='9') { i=(*ptr++)-48; fonte=styles[i].fonte; gras=styles[i].gras; italique=styles[i].italique; souligne=styles[i].souligne; surligne=styles[i].surligne; } } goto format; } if (*ptr=='—') { //Commande ptr++; if (*ptr=='E' || *ptr=='e') { //Imprimer l'expression while(*ptr!=' ' && *ptr!='—' && *ptr) ptr++; if (*ptr==' ') ptr++; while(*ptr && *ptr!='—') fputc(*ptr++,dst); if (!(*ptr)) break; ptr++; } else if (*ptr=='P' || *ptr=='p') { //Imprimer le nom de l'image while(*ptr!=' ' && *ptr!='—' && *ptr) ptr++; fputs("[image:",dst); if (*ptr==' ') ptr++; while(*ptr && *ptr!='—') fputc(*ptr++,dst); fputs(".bmp]",dst); if (!(*ptr)) break; ptr++; } else { if (!avertCmd) { avertCmd=1; AjWarning("WARN02: Vous utilisez des commandes incompatibles avec le format RTF!"); } while(*ptr && *ptr!='—') ptr++; if (!(*ptr)) break; ptr++; } continue; } if (*ptr=='\\') { //Caractère ptr++; if (*ptr>='0' && *ptr<='9') { i=0; while(*ptr>='0' && *ptr<='9' && i",dst); else if (*ptr==19 || *ptr==23) fputs("^",dst); else if (*ptr==20 || *ptr==24) fputs("v",dst); else if (*ptr==16) fputs("-",dst); else if (*ptr==127) fputs("DIAMOND",dst); else { fputc(*ptr++,dst); ptr--; } ptr++; } } format: if (fonte!=afonte) { sprintf(balise,"\\fs%02i",16+4*fonte); fputs(balise,dst); } if (gras!=agras) { if (gras==0) fputs("\\b0",dst); else fputs("\\b",dst); } if (italique!=aitalique) { if (italique==0) fputs("\\i0",dst); else fputs("\\i",dst); } if (souligne!=asouligne) { if (souligne==0) fputs("\\ulnone",dst); else fputs("\\ul",dst); } if (surligne!=asurligne) { if (surligne==1) fputs("\\highlight0 \\cf0",dst); else if (surligne==3) fputs("\\highlight3 \\cf0",dst); else if (surligne==4) fputs("\\highlight4 \\cf0",dst); else fputs("\\highlight2 \\cf1",dst); } if (afonte!=fonte || agras!=gras || aitalique!=italique || asouligne!=souligne || asurligne!=surligne) fputc(' ',dst); afonte=fonte; agras=gras; aitalique=italique; asouligne=souligne; asurligne=surligne; } fputs("\n\\par }\n",dst); fclose(src); fclose(dst); FinFichErr(); fclose(err); free(chn); return TRUE; pasbon: fputs("\n\\par }\n",dst); fclose(src); fclose(dst); fclose(err); free(chn); return FALSE; } BOOL RTF_TW (char *source, char *destination, unsigned char format) { FILE *src; FILE *dst; FILE *err; char *chn; char *ptr; int i; char balise[1000]; int fonte, gras, italique, souligne, surligne; int afonte, agras, aitalique, asouligne, asurligne; char str[1000]; if (!(err=fopen("errs.txt","w"))) return FALSE; InitFichErr("Conversion de fichier RTF -> Text Walker"); if (!(chn=(char*)malloc(MAX_CHAINE))) { AjErreur("ERR01: Pas pu allouer!."); fclose(err); return FALSE; } if (!(src=fopen(source,"r"))) { free(chn); AjErreur("ERR02: Fichier source non-trouvé."); fclose(err); return FALSE; } // if (!(dst=fopen(destination,"w"))) { if (!(dst=fopen("~_tmptext¨~.txt","w"))) { free(chn); fclose(src); AjErreur("ERR03: Fichier destination inaccessible.\n"); fclose(err); return FALSE; } memset(chn,0,MAX_CHAINE); fread(chn,MAX_CHAINE,1,src); ptr=strstr(chn,"\\plain"); if (ptr==NULL) { ptr=strstr(chn,"\\pard"); if (ptr==NULL) { AjErreur("ERR04: Ce n'est pas un fichier RTF valide!\n"); goto pasbon; } } afonte=1; agras=aitalique=asouligne=0; asurligne=1; fonte=1; gras=italique=souligne=0; surligne=1; while(1) { if (!(*ptr)) break; if (*ptr=='{' || *ptr=='}') { ptr++; continue; } if (*ptr=='\\') { ptr++; if (*ptr=='\\') { fputc(*ptr++,dst); continue; } if (*ptr!='\'') ProchBalise(); //La balise est stockée dans str if (!strcmp(balise,"plain")) { //Annule tous les formats fonte=1; gras=italique=souligne=0; surligne=1; } else if (!strcmp(balise,"pard")) //Ne rien faire ; else if (*ptr=='\'') { //Caractère spécial balise[0]=*ptr; balise[1]=*(ptr+1); balise[2]=*(ptr+2); balise[3]=0; i=atox(balise+1); fputc(i,dst); ptr+=3; } else if (!strncmp(balise,"rquote",6)) { //guillemets fputc('\'',dst); } else if (!strncmp(balise,"fs",2)) { //Change la fonte i=atoi(balise+2); if (i<18) fonte=0; else if (i<24) fonte=1; else fonte=2; } else if (balise[0]=='b' && balise[1]=='0') //Gras inactif gras=0; else if (balise[0]=='b') //Gras actif gras=1; else if (!strcmp(balise,"ulnone")) //Soulignement inactif souligne=0; else if (!strcmp(balise,"ul")) //Soulignement actif souligne=1; else if (!strcmp(balise,"i0")) //Soulignement inactif souligne=0; else if (!strcmp(balise,"highlight0")) //Surlignement inactif surligne=1; //Inversé dans text walker! else if (!strncmp(balise,"highlight",9)) //Surlignement actif surligne=0; else if (!strncmp(balise,"par",3) || !strncmp(balise,"pard",4)) { // fputc(13,dst); // fputc(32,dst); fputc('\n',dst); } if (balise[0]!='\'' && *ptr==' ') ptr++; } else { if (*ptr=='\n') { ptr++; continue; } //Si le format a été modifié, il faut le réécrire! if (fonte!=afonte) { sprintf(balise,"%cF%i",format,fonte); fputs(balise,dst); } if (gras!=agras) { sprintf(balise,"%cG%i",format,gras); fputs(balise,dst); } if (italique!=aitalique) { sprintf(balise,"%cI%i",format,italique); fputs(balise,dst); } if (souligne!=asouligne) { sprintf(balise,"%cS%i",format,souligne); fputs(balise,dst); } if (surligne!=asurligne) { sprintf(balise,"%cC%i",format,surligne); fputs(balise,dst); } afonte=fonte; agras=gras; aitalique=italique; asouligne=souligne; asurligne=surligne; // if (*ptr=='\n') // ptr++; if (*ptr=='$') fputs("\\036",dst); else if (*ptr=='©') fputs("\\169",dst); else if (*ptr==151) fputs("\\151",dst); else if (*ptr==27) fputs("\\027",dst); else if (*ptr=='\\') fputs("\\\\",dst); else if (*ptr==215) fputs("\\215",dst); else fputc(*ptr,dst); ptr++; } } fclose(src); fclose(dst); FinFichErr(); fclose(err); free(chn); fConvTxtTo89t("~_tmptext¨~.txt","main","hello.89t"); DeleteFile("~_tmptext¨~.txt"); return TRUE; pasbon: fclose(src); fclose(dst); fclose(err); free(chn); return FALSE; } const char *AnalCaractere(unsigned char *i) { if (*i==127) return "DIAMOND"; else if (*i==27) return "SHIFT"; else if (*i==169) return "©"; else if (*i==151) return "i"; else if (*i==14) return "LOCK"; else if (*i==15) return "V"; else return (const char *)i; }