//get arguments void get_arguments(int argc, char **argv) { //options if(argc>1) { FILE *f = fopen(argv[1],"rb"); if(!f) fn_alert("Erreur, le programme ne peux ouvrir le fichier:\n%s\n(passé en arguments...)",argv[1]); else { fclose(f); //Changer de mode si extention u001 const char *ext = fl_filename_ext(argv[1]); if(strcmp(ext,".u001")==0) I->rassembler->value(1); //change de mode... //mets les attributs (si changés par rassembler->value(1) rassembler_click(0); //ici, le mettre dans le textbox char str[1024]; //convertissement en chemin complet! fl_filename_absolute(str,1023,argv[1]); //update taille fichier seulement si mode division if(I->rassembler->value()==0) update_taille_fichier(str); //mets str dans I->str set_filename(str); } } else rassembler_click(0); }
void CFLTKEditor::SaveAs() { char *pcNewFile; char pcFilename[512]; string sNewFile; pcFilename[0] = 0; Fl_File_Chooser::sort = fl_casenumericsort; pcNewFile = fl_file_chooser(m_sFileChooserSaveTitle.c_str(), m_sFileChooserPattern.c_str(), pcFilename); if (pcNewFile != NULL) { sNewFile = pcNewFile; if (*fl_filename_ext(sNewFile.c_str()) == 0) { sNewFile = sNewFile + ".clu"; } // Check whether the name of current editor file is the same as // save as file, or whether new name is the same as that of a // file that is currently open. if (sNewFile != GetFilename()) { int i, iCount = m_mEditorData.Count(); for (i = 0; i < iCount; i++) { if (sNewFile == m_mEditorData[i].m_sFilename) { fl_alert("File with chosen name is already open in editor."); return; } } } SaveFile(sNewFile.c_str()); UpdateFileList(); } }
//pour rassembler les fichiers! //(le mode 2) void rassembler() { char buffer[buffer_size]; //teste l'existance if(!exists(I->fichier->value())) { fn_alert("Le fichier: \n\"%s\"\nn'existe pas...",I->fichier->value()); return; } //teste l'extention { const char *ext = fl_filename_ext(I->fichier->value()); if(!ext || strcmp(ext,".u001")) { fn_alert("L'extention du fichier:\n\"%s\"\ndoit être u001 (première division)...",I->fichier->value()); return; } } //crée quelques variables importantes int max_split=0; char *path = strdup(I->fichier->value()); if(!path) { fn_alert("Pas assez de mémoire..."); return; } if(!path) { fn_alert("Pas assez de mémoire..."); return; } char *new_path = 0; //il est mis après le test char *path_end = path+strlen(path)-5; //teste 'il y a un vide //maintenant tester si tous les fichier *.00* existent //et que rien ne manque //par ex s'il y a u001 002 puis 004 alors erreur car //003 n'existe pas... int i; for(i=1; i<=999; i++) { sprintf(path_end,".u%03i",i); if(exists(path)) max_split=i; else break; } if(max_split<1) { fn_alert("Le programme ne peux rassembler moins d'une division..."); free(path); return; } if(max_split==1) { fn_alert("Le programme n'a trouvé que le fichier u001.\nIl faut au moins deux divisions pour faire un rassemblement..."); free(path); return; } i++; //va vers le prochain carac for(; i<=999; i++) { sprintf(path_end,".u%03i",i); if(exists(path)) { fn_alert("Le programme a trouvé un vide entre le fichier ayant l'extention u%03i et u%03i...\nIl y a probablement des fichiers qui manquent!",max_split,i); free(path); } } path_end[0]=0; //enlève le .00x pour tester l'existance //et aussi pour créer new_path //l'existance c'est après new_path //CONVERTISSEMENT DE path en new_chemin/basename'path' //mets le chemin selon chemin->value() // //le résultat est dans new_path { char *slash = strrchr(path,C_RACINE); if(!slash) slash=path; // par exemple asher.fl :) else slash++; //passe le slash pour n'avoir que le BASENAME //allocation d'un new path new_path = (char *)malloc(strlen(I->chemin->value())+1+strlen(slash)+1); if(!path) { fn_alert("Pas assez de mémoire..."); free(path); return; } //mets le chemin char *strSlash = S_RACINE; if(strlen(I->chemin->value())>0 && I->chemin->value()[strlen(I->chemin->value())-1]==C_RACINE) strSlash=""; sprintf(new_path,"%s%s%s",I->chemin->value(),strSlash,slash); } //demande s'il veut continuer if(!fn_ask("Vous êtes sur le point de rassembler %i fichiers dans:\n\n\"%s\"\n\nCe fichier%ssera remplacé par le contenu des divisions.\nSouhaitez vous continuer?",max_split,new_path,exists(new_path)?" EXISTE et ":" ")) { free(path); free(new_path); return; } //ouvre le fichier destination FILE *file = fopen(new_path,"wb"); if(!file) { fn_alert("Le fichier: \"%s\"\n\nne peux être ouvert en écriture...",new_path); remove(new_path); //supprime le fichier ou l'on va rassembler free(path); free(new_path); return; } progress.show(); progress.value(0,0,""); //parcours les maxsplit for(i=1; i<=max_split; i++) { static size_t readed; sprintf(path_end,".u%03i",i); //met le nom du fichier { char value[30]; sprintf(value,"Ajout de la %i%s division...",i,(i==1)?"ère":"ème"); progress.value(-1,-1,value); } //ouverture FILE *file_src = fopen(path,"rb"); if(!file_src) { fn_alert("Le fichier \"%s\"\n\nne peux être ouvert en lecture...\n\nL'opération ne peux continuer...\n",path); *path_end=0; remove(new_path); //supprime le fichier ou l'on va rassembler free(path); free(new_path); fclose(file); return; } //calcule le size fseek(file_src,0,SEEK_END); long fsize=ftell(file_src); long fsize_writed=0; rewind(file_src); //transfers int percent; float n,d; while(!feof(file_src)) { //lecture readed=fread(buffer,1,buffer_size,file_src); if(!readed) break; fsize_writed+=(long)readed; //pour le calcul du pourcentage //écriture if(fwrite(buffer,readed,1,file)<1) { fn_alert("Erreur dans l'écriture dans le fichier:\n\"%s\"\nDisque plein ou protégé en écriture?",path); *path_end=0; remove(new_path); //supprime le fichier ou l'on va rassembler free(path); free(new_path); fclose(file); fclose(file_src); return; } //calcul pourcentage normal // fsize ----> 100 // fsize_writed //calcul du pourcentage !! n=fsize_writed; d=fsize; percent = (int)((n*100)/d); //encore n=((i-1)*100)+percent; d=max_split; //ce qui est en bas est déjà fait! progress.value((int)(n/d),percent); } //close fclose(file_src); } fclose(file); fn_message("L'opération de rassemblement finie avec succès!"); progress.hide(); if(fn_ask("voulez vous supprimer les fichiers des divisions de u001 à u%03i?",max_split)) { int err=0; for(int i=1; i<=max_split; i++) { sprintf(path_end,".u%03i",i); if(remove(path)) err=1; } if(err) fn_message("Les fichiers ont été supprimés, bien que\ncertains n'ont pas pu l'être!"); else fn_message("Les fichiers ont été supprimés avec succès!"); } //désallocation free(path); free(new_path); }
FL_EXPORT_C(const char*,flc_filename_ext)(const char* buf){ return fl_filename_ext(buf); }
filereader::filereader(const char*title,bool relptr,unsigned offbits,bool be){ char*fname; if(title) fname=loadsavefile(title); else fname=loadsavefile(); if(fname){ char*ext=(char*)fl_filename_ext(fname); ext=strdup(ext); for(char*p=ext;*p;++p) *p=tolower(*p); fileType_t def=tBinary; if(!strcmp(ext,".asm")) def=tASM; else if(!strcmp(ext,".bex")) def=tBEX; else if(!strcmp(ext,".h")) def=tCheader; free(ext); fileType_t tp=askSaveType(false,def); if(tp==tCancle){ amt=0; free(fname); return; } struct stat st; FILE*fp=fopen(fname,tp==tBinary?"rb":"r"); if(!fp){ fl_alert("An error has occurred: %s",strerror(errno)); amt=0; return; } if(fstat(fileno(fp),&st)!=0){ fl_alert("An error has occurred: %s",strerror(errno)); amt=0; fclose(fp); return; } char*tmp=(char*)malloc(st.st_size); fread(tmp,1,st.st_size,fp); fclose(fp); //This is handled by Lua code so the user can modify the behavior of this function with ease lua_getglobal(Lconf,"filereaderProcessText"); lua_pushinteger(Lconf,tp); lua_pushboolean(Lconf,relptr); lua_pushinteger(Lconf,offbits); lua_pushboolean(Lconf,be); lua_pushlstring(Lconf,tmp,st.st_size);//Lua makes a copy of the string lua_pushstring(Lconf,fname); free(fname); free(tmp); runLuaFunc(Lconf,6,1); size_t len=lua_rawlen(Lconf,-1); if(len){ lenTotal=0; amt=len; for(size_t i=1;i<=len;++i){ lua_rawgeti(Lconf,-1,i); //Get its name lua_rawgeti(Lconf,-1,1); names.emplace_back(lua_tostring(Lconf,-1)); lua_pop(Lconf,1); //Get its data lua_rawgeti(Lconf,-1,2); size_t ln; const char*src=lua_tolstring(Lconf,-1,&ln); void*dst=malloc(ln); memcpy(dst,src,ln); lens.push_back(ln); dat.push_back(dst); lenTotal+=ln; lua_pop(Lconf,2); } }else amt=0; lua_pop(Lconf,1); }else amt=0; }