Advertisement
Guest User

tB_edit

a guest
Jan 21st, 2011
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.43 KB | None | 0 0
  1. /*  TTTTTT        b
  2.       TT          b
  3.       TT  u u rrr bbb oo
  4.       TT  uuu r   bbb oo  Batch [version 0.0.2]
  5.                                                copyrigth (c) DarkBatcher 2010-2010
  6.  
  7. Ce Code est Open-Source; Vous êtes libre de diffuser, de modifier ce code sous certaines conditions:
  8.         1) Vous devez Garder la paternité du code, c'est à dire transmettre le nom de l'auteur original avec le code et l'éxecutable                                              
  9.         2) Vous devez diffuser le code et l'éxecutable sous les mêmes conditions que l'original
  10. */
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <windows.h>
  14. /* Constants definition */
  15. #define TB_EDIT_TOP 1
  16. #define TB_EDIT_BOTTOM 24
  17. #define TB_EDIT_LEFT 0
  18. #define TB_EDIT_RIGHT 79
  19. #define TB_MAX_LINE_LENGTH 512
  20. #define TB_ERROR_MALLOC 0x01
  21. #define TB_ERROR_OUTOFARRAY 0x02
  22.  
  23. /* variable gobales */
  24. HANDLE hConsole; /* handle de la console */
  25. short LineNumber=0; /*nombre de lignes contenues dans le fichier */
  26. /* fonctions */
  27. /* fonction pour deplacer le curseur dans la console DOS */
  28. void GotoXY(HANDLE hConsoleOutput, SHORT x, SHORT y)
  29. {
  30.     COORD P;
  31.     P.X = x;
  32.     P.Y = y;    
  33.     SetConsoleCursorPosition(hConsoleOutput, P);
  34. }
  35. /* fonction de lecture d'un fichier */
  36. short LoadFile(char* FilePath, char** FileTab)
  37. {
  38.      int i=0, j=0;
  39.      char Chaine[TB_MAX_LINE_LENGTH]="\0";
  40.      char *DelCr=NULL;
  41.      FILE* Fichier=NULL;
  42.      /* on ouvre le fichier */
  43.      Fichier=fopen(FilePath, "r+");
  44.      /* si le fichier n'a pas pu etre ouvert on le créé */
  45.      if (Fichier==NULL)
  46.      {
  47.         Fichier=fopen(FilePath, "w");
  48.         fclose(Fichier);
  49.         Fichier=fopen(FilePath, "r+");
  50.      }
  51.      if (Fichier==NULL) exit(0);
  52.      rewind(Fichier); /* on revient au début du fichier */
  53.      while (fgets(Chaine, 512, Fichier)!=NULL)
  54.      {
  55.            DelCr=strchr(Chaine, '\n');
  56.            if (DelCr!=NULL) *DelCr='\0';
  57.            if (FileTab[i]==NULL) FileTab[i]=malloc(TB_MAX_LINE_LENGTH*sizeof(char));
  58.            if (FileTab[i]==NULL) return TB_ERROR_MALLOC;
  59.            /* on efface le buffer venant d'etre aloué */
  60.            DelCr=FileTab[i];
  61.            for (j=0;j<512;j++)
  62.            {
  63.                DelCr[j]=0;
  64.            }
  65.            strcpy(FileTab[i], Chaine);
  66.            i++;
  67.            if (i==8192) return TB_ERROR_OUTOFARRAY;
  68.      }
  69.      fclose(Fichier);
  70.      i--;
  71.      FileTab[i]=NULL;
  72.      return i;
  73. }
  74. /* fonction d'affichage du texte préalablement chargé */
  75. char DispFile(char **FileTable, short LineY, short ColonX)
  76. {
  77.      int i=LineY, j=0;
  78.      char *Letter=NULL;
  79.      int b;
  80.      COORD Coordones;
  81.      Coordones.X=0;
  82.      Coordones.Y=1;
  83.      FillConsoleOutputCharacter(hConsole, 32, 1840, Coordones, NULL);
  84.      GotoXY(hConsole, 0, 1);    
  85.      while ((i<=LineNumber) && (i<LineY+23))
  86.      {
  87.            if (FileTable[i]!=NULL)
  88.            {
  89.               Letter=FileTable[i];
  90.               Letter+=ColonX;
  91.               for (j=0;j<78;j++)
  92.               {
  93.                   if (*Letter=='\0') break;
  94.                   fputc(*Letter, stdout);
  95.                   Letter++;
  96.               }
  97.            }    
  98.            fputc('\n', stdout);
  99.            i++;
  100.      }
  101.      return 0;
  102. }
  103.  
  104. char SetLineContent(char* Ligne, short Width, char Character)
  105. {
  106.      int i=0;
  107.      if (strlen(Ligne)>=511) return 1;
  108.      i=strlen(Ligne);
  109.      while (i>=Width) /* on déplace les éléments du tableau */
  110.      {
  111.            Ligne[i+1]=Ligne[i];
  112.            i--;
  113.      }
  114.      Ligne[Width]=Character;
  115.      return 0;
  116. }
  117.  
  118. char SetLineBackSpace(char* Ligne, short Width)
  119. {
  120.      int i=strlen(Ligne);
  121.      if (i<=0) return 1;
  122.      Width--;
  123.      while (i>=Width) /* on déplace les éléments du tableau */
  124.      {
  125.            Ligne[Width]=Ligne[Width+1];
  126.            Width++;
  127.      }
  128.      return 0;
  129. }                    
  130. char AddCrLf(char **FileTable, short Line, short Width)
  131. {
  132.      int i;
  133.      char* temp=NULL;
  134.      for (i=LineNumber;i>=Line;i--)
  135.      {
  136.          FileTable[i+1]=FileTable[i];
  137.      }
  138.      FileTable[Line]=NULL;
  139.      LineNumber++;
  140.      return 0;
  141. }
  142. char RemoveCrLf(char **FileTable, short Line, short Width)
  143. {
  144.      int i;
  145.      char* temp=NULL;
  146.      for (i=Line;i<=LineNumber;i++)
  147.      {
  148.          FileTable[i-1]=FileTable[i];
  149.      }
  150.      LineNumber--;
  151.      return 0;
  152. }
  153. char SaveFile(char** FileTable, char* FilePath)
  154. {
  155.      int i=0;
  156.      FILE* Fichier=NULL;
  157.      Fichier=fopen(FilePath, "w+");
  158.      if (Fichier==NULL)
  159.      {
  160.         printf("Ecriture du fichier impossible!\n");
  161.         exit(1);
  162.      }
  163.      for (i=0;i<=LineNumber;i++)
  164.      {
  165.          if (FileTable[i]!=NULL) fputs(FileTable[i], Fichier);
  166.          fputc('\n', Fichier);
  167.      }
  168.      fclose(Fichier);
  169. }
  170. /* fonction main */    
  171. int main(int argc, char *argv[])
  172. {
  173.   /* déclarations des variariables
  174.      ----------------------------- */
  175.  
  176.   short i=0;
  177.   char key=0;
  178.   COORD X;
  179.  
  180.   /* position du curseur */
  181.  
  182.   short CursorX=0, CursorY=1;
  183.  
  184.   /* position du text dans la fenetre */
  185.  
  186.   short LineX=0, LineY=0;
  187.  
  188.   /* Fichier ouvert */
  189.  
  190.   char FilePath[MAX_PATH]="\0"; // chemin du fichier
  191.   char *FileName=NULL; //pointeur sur le nom du fichier
  192.  
  193.   /* Contenant du fichier ouvert */
  194.  
  195.   char *LineTable[8192]={NULL};
  196.  
  197.   /* handle de la fenetre DOS */
  198.  
  199.   hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  200.  
  201.   /* -----------------------------------------------
  202.      | Debut du code de l'editeur                  |
  203.      ----------------------------------------------- */
  204.     /* recupération du nom de fichier passé en parametre */
  205.   if (argc>=2)
  206.   {
  207.      strcpy(FilePath, argv[1]);
  208.      FileName=strrchr(FilePath, '\\');
  209.      if (FileName==NULL) FileName=FilePath;
  210.      else FileName++;
  211.   }
  212.   else
  213.   {
  214.      strcpy(FilePath, "Sans Nom.bat");
  215.      FileName=FilePath;
  216.   }
  217.   /* affichage de la bordure supérieure */
  218.   fputc('À', stdout);
  219.   for (i=0;i<77;i++)
  220.   {
  221.       fputc('Ä', stdout);
  222.   }
  223.   fputc('Ù', stdout);
  224.   /* ecriture du nom de fichier ouvert */
  225.   GotoXY(hConsole, 3, 0);
  226.   printf("%s", FileName);
  227.   /* affichage du la rubrique d'aide */
  228.   GotoXY(hConsole, 65, 0);
  229.   printf("F1=aide\n");
  230.   /*  chargement du fichier passé en paramètre */
  231.   if (argc>=2)
  232.   {
  233.      LineNumber=LoadFile(FilePath, LineTable);
  234.      DispFile(LineTable, LineY, LineX);
  235.      GotoXY(hConsole, CursorX, CursorY);
  236.   }
  237.   while (1)
  238.   {
  239.   key=getch();
  240.   /* gestion des évenements du clavier */
  241.      switch (key)
  242.      {
  243.          case 0 :  /* si l'utilisateur a appuyé sur une touche qui n'a pas de code ASCII */
  244.               key=getch();
  245.               switch (key)
  246.               {
  247.                      case 59 :
  248.                           /* si l'uitlisateur demande de l'aide */
  249.                          GotoXY(hConsole, 0, 8);
  250.                          printf("                    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n                    ³ Aide:                                 ³\n                    ³       ESC = Quitter                   ³\n                    ³       F2  = Ouvrir                    ³");
  251.                          printf("\n                    ³       F3  = Enregistrer               ³\n                    ³       F4  = Enregistrer sous ...      ³\n                    ³       F5  = Ex‚cuter                  ³");
  252.                          printf("\n                    ³                                       ³\n                    ³ TurboBatch [Version 1.0]              ³\n                    ³ Copyrigth (c) Darkbatcher 2010-2011   ³\n                    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
  253.                          getch();
  254.                          GotoXY(hConsole, 0, 8);
  255.                          printf("                                                             \n                                                             \n                                                             \n                                                             \n");
  256.                          printf("                                                             \n                                                              \n                                                             ");
  257.                          printf("\n                                                             \n                                                             \n                                                             \n                                                             ");
  258.                          GotoXY(hConsole, CursorX, CursorY);
  259.                          DispFile(LineTable, LineY, LineX);
  260.                          break;
  261.                      case 60:
  262.                           /* si l'utilisateur veut ouvrir un fichier */
  263.                           X.X=0;
  264.                           X.Y=0;
  265.                           FillConsoleOutputCharacter(hConsole, 32, 2400, X, NULL); //on efface l'écran
  266.                           printf("Quel fichier voulez vous ouvrir ? (s'il n'existe pas il sera cr‚‚)\n");
  267.                           fgets(FilePath, MAX_PATH, stdin); // on demande le nom du fichier
  268.                           FileName=strchr(FilePath, '\n'); // on supprime le CR et Le LF à la fin du fichier
  269.                           if (FileName!=NULL) *FileName='\0';
  270.                           LineNumber=LoadFile(FilePath, LineTable); //on le charge
  271.                           FileName=strrchr(FilePath, '\\'); // on découpe le nom de fichier
  272.                           if (FileName==NULL) FileName=FilePath;
  273.                           else FileName++;
  274.                           GotoXY(hConsole, 0, 0);
  275.                           /* affichage de la bordure supérieure */
  276.                           fputc('À', stdout);
  277.                           for (i=0;i<77;i++)
  278.                           {
  279.                               fputc('Ä', stdout);
  280.                           }
  281.                           fputc('Ù', stdout);
  282.                           /* ecriture du nom de fichier ouvert */
  283.                           GotoXY(hConsole, 3, 0);
  284.                           printf("%s", FileName);
  285.                           /* affichage du la rubrique d'aide */
  286.                           GotoXY(hConsole, 65, 0);
  287.                           printf("F1=aide\n");
  288.                           LineY=0;
  289.                           LineX=0;
  290.                           CursorY=TB_EDIT_TOP;
  291.                           CursorX=TB_EDIT_LEFT;
  292.                           DispFile(LineTable, 0, 0);
  293.                           GotoXY(hConsole, CursorX, CursorY);
  294.                           break;
  295.                      case 61:
  296.                           /* si l'utilisateur veut sauvegarder le fichier */
  297.                          SaveFile(LineTable, FilePath);
  298.                          FileName=strrchr(FilePath, '\\');
  299.                          if (FileName==NULL) FileName=FilePath;
  300.                          else FileName++;
  301.                          /* affichage de la bordure supérieure */
  302.                          fputc('À', stdout);
  303.                          for (i=0;i<77;i++)
  304.                          {
  305.                              fputc('Ä', stdout);
  306.                          }
  307.                          fputc('Ù', stdout);
  308.                          /* ecriture du nom de fichier ouvert */
  309.                          GotoXY(hConsole, 3, 0);
  310.                          printf("%s", FileName);
  311.                          /* affichage du la rubrique d'aide */
  312.                          GotoXY(hConsole, 65, 0);
  313.                          printf("F1=aide\n");
  314.                          LineY=0;
  315.                          LineX=0;
  316.                          CursorY=0;
  317.                          CursorX=0;
  318.                          DispFile(LineTable,0,0);
  319.                          break;
  320.                      case 62:
  321.                           /* si l'utilisateur veut enregistrer le fichier sous */
  322.                           X.X=0;
  323.                           X.Y=0;
  324.                           FillConsoleOutputCharacter(hConsole, 32, 2400, X, NULL); //on efface l'écran
  325.                           printf("Sous quel nom enregistrer le fichier ? (s'il n'existe pas il sera cr‚‚)\n");
  326.                          /* on récupère le nom du fichier */
  327.                          fgets(FilePath, MAX_PATH, stdin);
  328.                          /* on sauve le fichier */
  329.                          SaveFile(LineTable, FilePath);
  330.                          FileName=strrchr(FilePath, '\\');
  331.                          if (FileName==NULL) FileName=FilePath;
  332.                          else FileName++;
  333.                          /* affichage de la bordure supérieure */
  334.                          fputc('À', stdout);
  335.                          for (i=0;i<77;i++)
  336.                          {
  337.                              fputc('Ä', stdout);
  338.                          }
  339.                          fputc('Ù', stdout);
  340.                          /* ecriture du nom de fichier ouvert */
  341.                          GotoXY(hConsole, 3, 0);
  342.                          printf("%s", FileName);
  343.                          /* affichage du la rubrique d'aide */
  344.                          GotoXY(hConsole, 65, 0);
  345.                          printf("F1=aide\n");
  346.                          break;
  347.                      case 63:
  348.                           /* si l'utilisateur veut executer le script */
  349.                           /* on crée le fichier temporaire */
  350.                           SaveFile(LineTable, "tb$$.bat");
  351.                           system("cls");
  352.                           /* on lance le fichier temporaire */
  353.                           system("tb$$.bat");
  354.                           remove("tb$$.bat");
  355.                           /* quand l'éxécution est terminée */
  356.                           for (i=0;i<77;i++)
  357.                           {
  358.                              fputc('Ä', stdout);
  359.                           }
  360.                           fputc('\n', stdout);
  361.                           printf("Ex‚cution du script termin‚e ... appuyez sur une touche pour continuer\n");
  362.                           for (i=0;i<77;i++)
  363.                           {
  364.                              fputc('Ä', stdout);
  365.                           }
  366.                           getch();
  367.                           GotoXY(hConsole, 0, 0);
  368.                           /* affichage de la bordure supérieure */
  369.                           fputc('À', stdout);
  370.                           for (i=0;i<77;i++)
  371.                           {
  372.                              fputc('Ä', stdout);
  373.                           }
  374.                           fputc('Ù', stdout);
  375.                           /* ecriture du nom de fichier ouvert */
  376.                           GotoXY(hConsole, 3, 0);
  377.                           printf("%s", FileName);
  378.                           /* affichage du la rubrique d'aide */
  379.                           GotoXY(hConsole, 65, 0);
  380.                           printf("F1=aide\n");
  381.                           DispFile(LineTable, LineY, LineX);
  382.                           break;              
  383.               }
  384.               break;
  385.          case -32:
  386.               /* si l'utilisateur a appuyé sur une flèche */
  387.               key=getch();
  388.               switch (key)
  389.               {
  390.                   case 72:
  391.                           /* si l'utilisateur a appuyé sur la fleche du haut */
  392.                           if (CursorY>TB_EDIT_TOP)
  393.                           {
  394.                              CursorY--;
  395.                              GotoXY(hConsole, CursorX, CursorY);
  396.                           }
  397.                           else if (CursorY<=TB_EDIT_TOP)
  398.                           {
  399.                                if (LineY>0)
  400.                                {
  401.                                   LineY--;
  402.                                   DispFile(LineTable, LineY, LineX);
  403.                                }
  404.                                else LineY=0;
  405.                                GotoXY(hConsole, CursorX, CursorY);
  406.                           }
  407.                           break;
  408.                      case 80:
  409.                           /* si l'utilisateur a apuyé sur la fleche du bas */
  410.                           if (CursorY<TB_EDIT_BOTTOM)
  411.                           {
  412.                              CursorY++;
  413.                              GotoXY(hConsole, CursorX, CursorY);
  414.                           }
  415.                           else if (CursorY>=TB_EDIT_BOTTOM)
  416.                           {
  417.                                if (LineY<LineNumber-1)
  418.                                {
  419.                                     LineY++;
  420.                                     DispFile(LineTable, LineY, LineX);
  421.                                }
  422.                                else LineY=LineNumber;
  423.                                GotoXY(hConsole, CursorX, CursorY);
  424.                           }
  425.                           break;
  426.                      case 75:
  427.                           /* si l'utilisateur a appuyé sur la flèche gauche */
  428.                           if (CursorX>TB_EDIT_LEFT)
  429.                           {
  430.                              CursorX--;
  431.                              GotoXY(hConsole, CursorX, CursorY);
  432.                           }
  433.                           else if (CursorX<=TB_EDIT_LEFT)
  434.                           {
  435.                                if (LineX>0)
  436.                                {
  437.                                             LineX--;
  438.                                             DispFile(LineTable, LineY, LineX);
  439.                                }
  440.                                else LineX=0;
  441.                                GotoXY(hConsole, CursorX, CursorY);
  442.                           }
  443.                           break;
  444.                      case 77:
  445.                           /* si l'utilisateur a appuyé sur la flèche droite */                            
  446.                           if (CursorX<TB_EDIT_RIGHT)
  447.                           {
  448.                              CursorX++;
  449.                              GotoXY(hConsole, CursorX, CursorY);
  450.                           }
  451.                           else if (CursorX>=TB_EDIT_RIGHT)
  452.                           {
  453.                                if (LineX<strlen(LineTable[CursorY-1])-1)
  454.                                {
  455.                                              LineX++;
  456.                                              DispFile(LineTable, LineY, LineX);
  457.                                              
  458.                                }
  459.                                else LineX=strlen(LineTable[CursorY-1]);
  460.                                GotoXY(hConsole, CursorX, CursorY);
  461.                           }
  462.                           break;
  463.               }
  464.               break;
  465.          case 13 :
  466.               {
  467.               /* si l'utilisateur veut passer une ligne */
  468.               AddCrLf(LineTable, LineY+CursorY, LineX+CursorX);
  469.               CursorY++;
  470.               CursorX=0;
  471.               DispFile(LineTable, LineY, LineX);
  472.               GotoXY(hConsole, CursorX, CursorY);
  473.               break;
  474.               }
  475.          case 27 :
  476.               /* si l'utilisateur veut quitter */
  477.               exit(0);
  478.          case 8:
  479.               /* si l'utilisateur à appuyer sur la touche backspace */
  480.               if (LineTable[CursorY-1]!=NULL)
  481.               {
  482.                  if (LineX+CursorX>0)
  483.                  {
  484.                     SetLineBackSpace(LineTable[LineY+CursorY-1], LineX+CursorX);
  485.                     CursorX--;
  486.                  }
  487.                  else
  488.                  {
  489.                      RemoveCrLf(LineTable, LineY+CursorY, LineX+CursorX);
  490.                  }
  491.                  DispFile(LineTable, LineY, LineX);
  492.                  GotoXY(hConsole, CursorX, CursorY);
  493.               }
  494.               break;
  495.          default:
  496.                  if (LineTable[LineY+CursorY-1]==NULL)
  497.                  {
  498.                       LineTable[LineY+CursorY-1]=malloc(TB_MAX_LINE_LENGTH*sizeof(char));
  499.                       if (LineTable[LineY+CursorY-1]==NULL) return 1;
  500.                       for (i=0;i<512;i++)
  501.                       {
  502.                           (LineTable[LineY+CursorY-1])[i]='\0';
  503.                       }
  504.                  }
  505.                  if (LineY+CursorY>=LineNumber) LineNumber=CursorY;                          
  506.                  if (!SetLineContent(LineTable[LineY+CursorY-1], CursorX, key)) DispFile(LineTable, LineY, LineX);
  507.                  CursorX++;
  508.                  GotoXY(hConsole, CursorX, CursorY);
  509.      }
  510.   }
  511.   return 0;
  512. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement