예제 #1
0
//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);
}
예제 #2
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();
	}
}
예제 #3
0
//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);
}
예제 #4
0
파일: filenameC.cpp 프로젝트: cmears/fltkhs
 FL_EXPORT_C(const char*,flc_filename_ext)(const char* buf){
   return fl_filename_ext(buf);
 }
예제 #5
0
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;
}