Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* TTTTTT b
- TT b
- TT u u rrr bbb oo
- TT uuu r bbb oo Batch [version 0.0.2]
- copyrigth (c) DarkBatcher 2010-2010
- Ce Code est Open-Source; Vous êtes libre de diffuser, de modifier ce code sous certaines conditions:
- 1) Vous devez Garder la paternité du code, c'est à dire transmettre le nom de l'auteur original avec le code et l'éxecutable
- 2) Vous devez diffuser le code et l'éxecutable sous les mêmes conditions que l'original
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- /* Constants definition */
- #define TB_EDIT_TOP 1
- #define TB_EDIT_BOTTOM 24
- #define TB_EDIT_LEFT 0
- #define TB_EDIT_RIGHT 79
- #define TB_MAX_LINE_LENGTH 512
- #define TB_ERROR_MALLOC 0x01
- #define TB_ERROR_OUTOFARRAY 0x02
- /* variable gobales */
- HANDLE hConsole; /* handle de la console */
- short LineNumber=0; /*nombre de lignes contenues dans le fichier */
- /* fonctions */
- /* fonction pour deplacer le curseur dans la console DOS */
- void GotoXY(HANDLE hConsoleOutput, SHORT x, SHORT y)
- {
- COORD P;
- P.X = x;
- P.Y = y;
- SetConsoleCursorPosition(hConsoleOutput, P);
- }
- /* fonction de lecture d'un fichier */
- short LoadFile(char* FilePath, char** FileTab)
- {
- int i=0, j=0;
- char Chaine[TB_MAX_LINE_LENGTH]="\0";
- char *DelCr=NULL;
- FILE* Fichier=NULL;
- /* on ouvre le fichier */
- Fichier=fopen(FilePath, "r+");
- /* si le fichier n'a pas pu etre ouvert on le créé */
- if (Fichier==NULL)
- {
- Fichier=fopen(FilePath, "w");
- fclose(Fichier);
- Fichier=fopen(FilePath, "r+");
- }
- if (Fichier==NULL) exit(0);
- rewind(Fichier); /* on revient au début du fichier */
- while (fgets(Chaine, 512, Fichier)!=NULL)
- {
- DelCr=strchr(Chaine, '\n');
- if (DelCr!=NULL) *DelCr='\0';
- if (FileTab[i]==NULL) FileTab[i]=malloc(TB_MAX_LINE_LENGTH*sizeof(char));
- if (FileTab[i]==NULL) return TB_ERROR_MALLOC;
- /* on efface le buffer venant d'etre aloué */
- DelCr=FileTab[i];
- for (j=0;j<512;j++)
- {
- DelCr[j]=0;
- }
- strcpy(FileTab[i], Chaine);
- i++;
- if (i==8192) return TB_ERROR_OUTOFARRAY;
- }
- fclose(Fichier);
- i--;
- FileTab[i]=NULL;
- return i;
- }
- /* fonction d'affichage du texte préalablement chargé */
- char DispFile(char **FileTable, short LineY, short ColonX)
- {
- int i=LineY, j=0;
- char *Letter=NULL;
- int b;
- COORD Coordones;
- Coordones.X=0;
- Coordones.Y=1;
- FillConsoleOutputCharacter(hConsole, 32, 1840, Coordones, NULL);
- GotoXY(hConsole, 0, 1);
- while ((i<=LineNumber) && (i<LineY+23))
- {
- if (FileTable[i]!=NULL)
- {
- Letter=FileTable[i];
- Letter+=ColonX;
- for (j=0;j<78;j++)
- {
- if (*Letter=='\0') break;
- fputc(*Letter, stdout);
- Letter++;
- }
- }
- fputc('\n', stdout);
- i++;
- }
- return 0;
- }
- char SetLineContent(char* Ligne, short Width, char Character)
- {
- int i=0;
- if (strlen(Ligne)>=511) return 1;
- i=strlen(Ligne);
- while (i>=Width) /* on déplace les éléments du tableau */
- {
- Ligne[i+1]=Ligne[i];
- i--;
- }
- Ligne[Width]=Character;
- return 0;
- }
- char SetLineBackSpace(char* Ligne, short Width)
- {
- int i=strlen(Ligne);
- if (i<=0) return 1;
- Width--;
- while (i>=Width) /* on déplace les éléments du tableau */
- {
- Ligne[Width]=Ligne[Width+1];
- Width++;
- }
- return 0;
- }
- char AddCrLf(char **FileTable, short Line, short Width)
- {
- int i;
- char* temp=NULL;
- for (i=LineNumber;i>=Line;i--)
- {
- FileTable[i+1]=FileTable[i];
- }
- FileTable[Line]=NULL;
- LineNumber++;
- return 0;
- }
- char RemoveCrLf(char **FileTable, short Line, short Width)
- {
- int i;
- char* temp=NULL;
- for (i=Line;i<=LineNumber;i++)
- {
- FileTable[i-1]=FileTable[i];
- }
- LineNumber--;
- return 0;
- }
- char SaveFile(char** FileTable, char* FilePath)
- {
- int i=0;
- FILE* Fichier=NULL;
- Fichier=fopen(FilePath, "w+");
- if (Fichier==NULL)
- {
- printf("Ecriture du fichier impossible!\n");
- exit(1);
- }
- for (i=0;i<=LineNumber;i++)
- {
- if (FileTable[i]!=NULL) fputs(FileTable[i], Fichier);
- fputc('\n', Fichier);
- }
- fclose(Fichier);
- }
- /* fonction main */
- int main(int argc, char *argv[])
- {
- /* déclarations des variariables
- ----------------------------- */
- short i=0;
- char key=0;
- COORD X;
- /* position du curseur */
- short CursorX=0, CursorY=1;
- /* position du text dans la fenetre */
- short LineX=0, LineY=0;
- /* Fichier ouvert */
- char FilePath[MAX_PATH]="\0"; // chemin du fichier
- char *FileName=NULL; //pointeur sur le nom du fichier
- /* Contenant du fichier ouvert */
- char *LineTable[8192]={NULL};
- /* handle de la fenetre DOS */
- hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
- /* -----------------------------------------------
- | Debut du code de l'editeur |
- ----------------------------------------------- */
- /* recupération du nom de fichier passé en parametre */
- if (argc>=2)
- {
- strcpy(FilePath, argv[1]);
- FileName=strrchr(FilePath, '\\');
- if (FileName==NULL) FileName=FilePath;
- else FileName++;
- }
- else
- {
- strcpy(FilePath, "Sans Nom.bat");
- FileName=FilePath;
- }
- /* affichage de la bordure supérieure */
- fputc('À', stdout);
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- fputc('Ù', stdout);
- /* ecriture du nom de fichier ouvert */
- GotoXY(hConsole, 3, 0);
- printf("%s", FileName);
- /* affichage du la rubrique d'aide */
- GotoXY(hConsole, 65, 0);
- printf("F1=aide\n");
- /* chargement du fichier passé en paramètre */
- if (argc>=2)
- {
- LineNumber=LoadFile(FilePath, LineTable);
- DispFile(LineTable, LineY, LineX);
- GotoXY(hConsole, CursorX, CursorY);
- }
- while (1)
- {
- key=getch();
- /* gestion des évenements du clavier */
- switch (key)
- {
- case 0 : /* si l'utilisateur a appuyé sur une touche qui n'a pas de code ASCII */
- key=getch();
- switch (key)
- {
- case 59 :
- /* si l'uitlisateur demande de l'aide */
- GotoXY(hConsole, 0, 8);
- printf(" ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n ³ Aide: ³\n ³ ESC = Quitter ³\n ³ F2 = Ouvrir ³");
- printf("\n ³ F3 = Enregistrer ³\n ³ F4 = Enregistrer sous ... ³\n ³ F5 = Ex‚cuter ³");
- printf("\n ³ ³\n ³ TurboBatch [Version 1.0] ³\n ³ Copyrigth (c) Darkbatcher 2010-2011 ³\n ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
- getch();
- GotoXY(hConsole, 0, 8);
- printf(" \n \n \n \n");
- printf(" \n \n ");
- printf("\n \n \n \n ");
- GotoXY(hConsole, CursorX, CursorY);
- DispFile(LineTable, LineY, LineX);
- break;
- case 60:
- /* si l'utilisateur veut ouvrir un fichier */
- X.X=0;
- X.Y=0;
- FillConsoleOutputCharacter(hConsole, 32, 2400, X, NULL); //on efface l'écran
- printf("Quel fichier voulez vous ouvrir ? (s'il n'existe pas il sera cr‚‚)\n");
- fgets(FilePath, MAX_PATH, stdin); // on demande le nom du fichier
- FileName=strchr(FilePath, '\n'); // on supprime le CR et Le LF à la fin du fichier
- if (FileName!=NULL) *FileName='\0';
- LineNumber=LoadFile(FilePath, LineTable); //on le charge
- FileName=strrchr(FilePath, '\\'); // on découpe le nom de fichier
- if (FileName==NULL) FileName=FilePath;
- else FileName++;
- GotoXY(hConsole, 0, 0);
- /* affichage de la bordure supérieure */
- fputc('À', stdout);
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- fputc('Ù', stdout);
- /* ecriture du nom de fichier ouvert */
- GotoXY(hConsole, 3, 0);
- printf("%s", FileName);
- /* affichage du la rubrique d'aide */
- GotoXY(hConsole, 65, 0);
- printf("F1=aide\n");
- LineY=0;
- LineX=0;
- CursorY=TB_EDIT_TOP;
- CursorX=TB_EDIT_LEFT;
- DispFile(LineTable, 0, 0);
- GotoXY(hConsole, CursorX, CursorY);
- break;
- case 61:
- /* si l'utilisateur veut sauvegarder le fichier */
- SaveFile(LineTable, FilePath);
- FileName=strrchr(FilePath, '\\');
- if (FileName==NULL) FileName=FilePath;
- else FileName++;
- /* affichage de la bordure supérieure */
- fputc('À', stdout);
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- fputc('Ù', stdout);
- /* ecriture du nom de fichier ouvert */
- GotoXY(hConsole, 3, 0);
- printf("%s", FileName);
- /* affichage du la rubrique d'aide */
- GotoXY(hConsole, 65, 0);
- printf("F1=aide\n");
- LineY=0;
- LineX=0;
- CursorY=0;
- CursorX=0;
- DispFile(LineTable,0,0);
- break;
- case 62:
- /* si l'utilisateur veut enregistrer le fichier sous */
- X.X=0;
- X.Y=0;
- FillConsoleOutputCharacter(hConsole, 32, 2400, X, NULL); //on efface l'écran
- printf("Sous quel nom enregistrer le fichier ? (s'il n'existe pas il sera cr‚‚)\n");
- /* on récupère le nom du fichier */
- fgets(FilePath, MAX_PATH, stdin);
- /* on sauve le fichier */
- SaveFile(LineTable, FilePath);
- FileName=strrchr(FilePath, '\\');
- if (FileName==NULL) FileName=FilePath;
- else FileName++;
- /* affichage de la bordure supérieure */
- fputc('À', stdout);
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- fputc('Ù', stdout);
- /* ecriture du nom de fichier ouvert */
- GotoXY(hConsole, 3, 0);
- printf("%s", FileName);
- /* affichage du la rubrique d'aide */
- GotoXY(hConsole, 65, 0);
- printf("F1=aide\n");
- break;
- case 63:
- /* si l'utilisateur veut executer le script */
- /* on crée le fichier temporaire */
- SaveFile(LineTable, "tb$$.bat");
- system("cls");
- /* on lance le fichier temporaire */
- system("tb$$.bat");
- remove("tb$$.bat");
- /* quand l'éxécution est terminée */
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- fputc('\n', stdout);
- printf("Ex‚cution du script termin‚e ... appuyez sur une touche pour continuer\n");
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- getch();
- GotoXY(hConsole, 0, 0);
- /* affichage de la bordure supérieure */
- fputc('À', stdout);
- for (i=0;i<77;i++)
- {
- fputc('Ä', stdout);
- }
- fputc('Ù', stdout);
- /* ecriture du nom de fichier ouvert */
- GotoXY(hConsole, 3, 0);
- printf("%s", FileName);
- /* affichage du la rubrique d'aide */
- GotoXY(hConsole, 65, 0);
- printf("F1=aide\n");
- DispFile(LineTable, LineY, LineX);
- break;
- }
- break;
- case -32:
- /* si l'utilisateur a appuyé sur une flèche */
- key=getch();
- switch (key)
- {
- case 72:
- /* si l'utilisateur a appuyé sur la fleche du haut */
- if (CursorY>TB_EDIT_TOP)
- {
- CursorY--;
- GotoXY(hConsole, CursorX, CursorY);
- }
- else if (CursorY<=TB_EDIT_TOP)
- {
- if (LineY>0)
- {
- LineY--;
- DispFile(LineTable, LineY, LineX);
- }
- else LineY=0;
- GotoXY(hConsole, CursorX, CursorY);
- }
- break;
- case 80:
- /* si l'utilisateur a apuyé sur la fleche du bas */
- if (CursorY<TB_EDIT_BOTTOM)
- {
- CursorY++;
- GotoXY(hConsole, CursorX, CursorY);
- }
- else if (CursorY>=TB_EDIT_BOTTOM)
- {
- if (LineY<LineNumber-1)
- {
- LineY++;
- DispFile(LineTable, LineY, LineX);
- }
- else LineY=LineNumber;
- GotoXY(hConsole, CursorX, CursorY);
- }
- break;
- case 75:
- /* si l'utilisateur a appuyé sur la flèche gauche */
- if (CursorX>TB_EDIT_LEFT)
- {
- CursorX--;
- GotoXY(hConsole, CursorX, CursorY);
- }
- else if (CursorX<=TB_EDIT_LEFT)
- {
- if (LineX>0)
- {
- LineX--;
- DispFile(LineTable, LineY, LineX);
- }
- else LineX=0;
- GotoXY(hConsole, CursorX, CursorY);
- }
- break;
- case 77:
- /* si l'utilisateur a appuyé sur la flèche droite */
- if (CursorX<TB_EDIT_RIGHT)
- {
- CursorX++;
- GotoXY(hConsole, CursorX, CursorY);
- }
- else if (CursorX>=TB_EDIT_RIGHT)
- {
- if (LineX<strlen(LineTable[CursorY-1])-1)
- {
- LineX++;
- DispFile(LineTable, LineY, LineX);
- }
- else LineX=strlen(LineTable[CursorY-1]);
- GotoXY(hConsole, CursorX, CursorY);
- }
- break;
- }
- break;
- case 13 :
- {
- /* si l'utilisateur veut passer une ligne */
- AddCrLf(LineTable, LineY+CursorY, LineX+CursorX);
- CursorY++;
- CursorX=0;
- DispFile(LineTable, LineY, LineX);
- GotoXY(hConsole, CursorX, CursorY);
- break;
- }
- case 27 :
- /* si l'utilisateur veut quitter */
- exit(0);
- case 8:
- /* si l'utilisateur à appuyer sur la touche backspace */
- if (LineTable[CursorY-1]!=NULL)
- {
- if (LineX+CursorX>0)
- {
- SetLineBackSpace(LineTable[LineY+CursorY-1], LineX+CursorX);
- CursorX--;
- }
- else
- {
- RemoveCrLf(LineTable, LineY+CursorY, LineX+CursorX);
- }
- DispFile(LineTable, LineY, LineX);
- GotoXY(hConsole, CursorX, CursorY);
- }
- break;
- default:
- if (LineTable[LineY+CursorY-1]==NULL)
- {
- LineTable[LineY+CursorY-1]=malloc(TB_MAX_LINE_LENGTH*sizeof(char));
- if (LineTable[LineY+CursorY-1]==NULL) return 1;
- for (i=0;i<512;i++)
- {
- (LineTable[LineY+CursorY-1])[i]='\0';
- }
- }
- if (LineY+CursorY>=LineNumber) LineNumber=CursorY;
- if (!SetLineContent(LineTable[LineY+CursorY-1], CursorX, key)) DispFile(LineTable, LineY, LineX);
- CursorX++;
- GotoXY(hConsole, CursorX, CursorY);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement