Advertisement
dmilicev

edit_string_v1.c

Mar 3rd, 2020
289
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.27 KB | None
  1. /*
  2.  
  3.     edit_string_v1.c                by Dragan Milicev
  4.  
  5.     Edit a string in a single line using the left arrow, right arrow,
  6.     home, end, backspace, insert and enter keys.
  7.  
  8.  
  9.     Ascii table:
  10.  
  11.     characters_0    0 -  31   special characters
  12.  
  13.     characters_1   32 -  47
  14.  
  15.     0 - 9    48 -  57   digits
  16.  
  17.     characters_2   58 -  64
  18.  
  19.     A - Z    65 -  90   capital letters
  20.  
  21.     characters_3   91 -  96
  22.  
  23.     a - z    97 - 122   small letters
  24.  
  25.     characters_4  123 - 126
  26.  
  27.  
  28.     You can find all my C programs at Dragan Milicev's pastebin:
  29.  
  30.     https://pastebin.com/u/dmilicev
  31.  
  32. */
  33.  
  34. #include <stdio.h>
  35. #include <string.h>
  36. #include <windows.h>        // tracking cursor all the time, for cursor position functions
  37.                             // gotoxy(x,y) , wherex() , wherey(), showcursor(), hidecursor()
  38.  
  39. #define CTRL_Z          26  // keys Ctrl + Z
  40. #define CTRL_X          24  // keys Ctrl + X
  41. #define CTRL_C           3  // keys Ctrl + C
  42. #define CTRL_V          22  // keys Ctrl + V
  43. #define BACKSPACE        8  // key Backspace
  44. #define TAB              9  // key Tab
  45. #define ENTER           13  // key Enter
  46. #define ESC             27  // Escape key
  47. #define UP              72  // up arrow
  48. #define DOWN            80  // down arrow
  49. #define LEFT            75  // left arrow
  50. #define RIGHT           77  // right arrow
  51. #define PG_UP           73  // Page Up key
  52. #define PG_DOWN         81  // Page Down down key
  53. #define HOME            71  // Home key
  54. #define END             79  // End key
  55. #define DEL             83  // Delete key
  56. #define INSERT          82  // Insert key
  57.  
  58.  
  59. // ----------CURSOR CONTROL FUNCTIONS------------------------------------------
  60.  
  61. // make console cursor invisible
  62. void hidecursor()
  63. {
  64.    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  65.    CONSOLE_CURSOR_INFO info;
  66.    info.dwSize = 20;
  67.    info.bVisible = FALSE;
  68.    SetConsoleCursorInfo(consoleHandle, &info);
  69. }
  70.  
  71. // make console cursor invisible
  72. void showcursor()
  73. {
  74.    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  75.    CONSOLE_CURSOR_INFO info;
  76.    info.dwSize = 20;
  77.    info.bVisible = TRUE;
  78.    SetConsoleCursorInfo(consoleHandle, &info);
  79. }
  80.  
  81. // make console cursor invisible
  82. void bigcursor()
  83. {
  84.    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  85.    CONSOLE_CURSOR_INFO info;
  86.    info.dwSize = 100;
  87.    info.bVisible = TRUE;
  88.    SetConsoleCursorInfo(consoleHandle, &info);
  89. }
  90.  
  91. // place cursor at position ( x, y ) = ( row, column )
  92. void gotoxy( int x, int y )
  93. {
  94.     COORD coord;
  95.  
  96.     coord.X = x;
  97.     coord.Y = y;
  98.  
  99.     SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), coord );
  100. }
  101.  
  102. // return x coordinate (column) of current cursor position
  103. // on failure return -1
  104. int wherex()
  105. {
  106.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  107.  
  108.     if (!GetConsoleScreenBufferInfo( GetStdHandle(STD_OUTPUT_HANDLE), &csbi ) )
  109.         return -1;
  110.  
  111.     return csbi.dwCursorPosition.X;
  112. }
  113.  
  114. // return y coordinate (row) of current cursor position
  115. // on failure return -1
  116. int wherey()
  117. {
  118.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  119.  
  120.     if (!GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE ), &csbi ) )
  121.         return -1;
  122.  
  123.     return csbi.dwCursorPosition.Y;
  124. }
  125.  
  126. // END OF-----CURSOR CONTROL FUNCTIONS------------------------------------------
  127.  
  128.  
  129. // ----------TEXT FOREGROUND AND BACKGROUND COLOR CONTROL FUNCTIONS-------------
  130.  
  131. void SetColorAndBackground(int ForgC, int BackC)
  132. {
  133.      WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
  134.      SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
  135.      return;
  136. } //SetColorAndBackground()
  137.  
  138. // END OF----TEXT FOREGROUND AND BACKGROUND COLOR CONTROL FUNCTIONS--------------
  139.  
  140.  
  141. // Edit a string in a single line using the left arrow, right arrow,
  142. // home, end, backspace, insert and enter keys.
  143. char *edit_string( int x, int y, int fc, int bc, char str[] )
  144. {
  145.     int i, c_choice, len, memX, insert_flag=1;
  146.     char *s;                                    // to copy str to s
  147.  
  148.     s = malloc( strlen(str) + 257 );            // reserve the memory space for copy and edit str
  149.  
  150.     if( s == NULL )                             // checking whether memory reallocation succeeded
  151.     {
  152.         fprintf(stderr, "\n\n malloc() for s error! \n\n");
  153.         exit(EXIT_FAILURE);
  154.     }
  155.  
  156.     strcpy(s,str);                              // copy str to s
  157.     gotoxy(x,y);
  158.     SetColorAndBackground(fc,bc);               // set colors to foreground and background colors
  159.     printf("%s", s);
  160.  
  161.     while( 1 ) {                                // an infinite loop that exits with Enter or Escape
  162.  
  163.         c_choice = _getch();                    // read  the keyboard
  164.  
  165.         switch( c_choice  ) {                   // scroll items and switch choice
  166.  
  167.             case BACKSPACE :                    // if Backspace key is pressed
  168.                     if(wherex()>x)
  169.                     {
  170.                         memX = wherex();
  171.                         len = strlen(s);
  172.                         for(i=memX-x-1; i<len; i++) // moving the characters to the left
  173.                             s[i] = s[i+1];
  174.                         s[i] = '\0';            // finish the new string s
  175.                         gotoxy(x,y);            // erase last print of string s
  176.                         SetColorAndBackground(7,0); // reset colors to system default colors
  177.                         for(i=0; i<len; i++)
  178.                             printf(" ");
  179.                         gotoxy(x,y);            // print string s
  180.                         SetColorAndBackground(fc,bc); // set colors to foreground and background colors
  181.                         printf("%s", s);
  182.                         gotoxy(memX-1,y );
  183.                     }
  184.                     break;
  185.             case ENTER :                        // if Enter key is pressed, exit from editing and return(s)
  186.                     SetColorAndBackground(7,0); // reset colors to system default colors
  187.  
  188.                     if( strlen(str) < strlen(s) )   // check memory space to copy s to str
  189.                     {
  190.                         realloc(str, strlen(s)+1);  // realloc the memory space to copy s to str
  191.  
  192.                         if( str == NULL )       // Checking whether memory reallocation succeeded
  193.                         {
  194.                             fprintf(stderr, "\n\n realloc() for str error! \n\n");
  195.                             exit(EXIT_FAILURE);
  196.                         }
  197.                     }
  198.                     strcpy(str,s);
  199.                     free(s);                    // free memory space reserved for s
  200.                     showcursor();
  201.                     return(str);
  202.                     break;
  203.             case ESC :                          // if Escape key is pressed, exit from editing and return(0)
  204.                     SetColorAndBackground(7,0); // reset colors to system default colors
  205.                     free(s);                    // free memory space reserved for s
  206.                     showcursor();
  207.                     return(str);                // return original string str
  208.                     break;
  209.             case  0  :                          // if pressed a function key
  210.             case 224 :                          // if pressed a special function key,
  211.                     c_choice = _getch();        // let's empty that 0 or 224 and
  212.                                                 // analyze which function key is pressed
  213.                     if( c_choice == LEFT )      // if pressed left arrow
  214.                     {
  215.                         if(wherex()>x)
  216.                             gotoxy(wherex()-1,y );
  217.                     } // if( c_choice == LEFT )
  218.  
  219.                     if( c_choice == RIGHT )     // if pressed right arrow
  220.                     {
  221.                         if(wherex()<x+strlen(s))
  222.                             gotoxy(wherex()+1,y );
  223.                     } // if( c_choice == RIGHT )
  224.  
  225.                     if( c_choice == HOME )      // if Home key is pressed
  226.                     {
  227.                         gotoxy(x,y);
  228.                     } // if( c_choice == HOME )
  229.  
  230.                     if( c_choice == END )       // if End key is pressed
  231.                     {
  232.                         gotoxy(x+strlen(s),y );
  233.                     } // if( c_choice == END )
  234.  
  235.                     if( c_choice == INSERT )    // if Insert key is pressed
  236.                     {
  237.                         if( insert_flag )
  238.                             insert_flag = 0;
  239.                         else
  240.                             insert_flag = 1;
  241.  
  242.                         if( insert_flag )
  243.                             showcursor();
  244.                         else
  245.                             bigcursor();
  246.                     } // if( c_choice == INSERT )
  247.  
  248.                     if( c_choice == DEL )       // if Delete key is pressed
  249.                     {
  250.                         if(wherex()>=x)
  251.                         {
  252.                             memX = wherex();
  253.                             len = strlen(s);
  254.                             for(i=memX-x; i<len; i++)   // moving the characters to the left
  255.                                 s[i] = s[i+1];
  256.                             s[i] = '\0';        // finish the new string s
  257.                             gotoxy(x,y);        // erase last print of string s
  258.                             SetColorAndBackground(7,0); // reset colors to system default colors
  259.                             for(i=0; i<len; i++)
  260.                                 printf(" ");
  261.                             gotoxy(x,y);        // print string s
  262.                             SetColorAndBackground(fc,bc); // set colors to foreground and background colors
  263.                             printf("%s", s);
  264.                             gotoxy(memX,y );
  265.                         }
  266.                     } // if( c_choice == DEL )
  267.  
  268.                     break;
  269.             default:
  270.                     if( c_choice >= 32 && c_choice <= 126 )
  271.                     {
  272.                         if ( insert_flag )      // to insert a character to string s
  273.                         {
  274.                             memX = wherex();
  275.                             len = strlen(s);
  276.                             for(i=len+2; i>=memX-x; i--) // moving the characters from end to the right
  277.                                 s[i+1] = s[i];
  278.                             s[memX-x] = c_choice;   // new character
  279.                             gotoxy(x,y);        // erase last print of string s
  280.                             for(i=0; i<len; i++)
  281.                                 printf(" ");
  282.                             gotoxy(x,y);        // print the new string s
  283.                             printf("%s", s);
  284.                             gotoxy(memX+1,y );
  285.                         } // if ( insert_flag )
  286.                         else                    // to overwrite a character to string s
  287.                         {
  288.                             memX = wherex();
  289.                             len = strlen(s);
  290.                             s[memX-x] = c_choice;   // new character
  291.                             s[len+1] = '\0';
  292.                             gotoxy(x,y);        // erase last print of string s
  293.                             for(i=0; i<len; i++)
  294.                                 printf(" ");
  295.                             gotoxy(x,y);        // print the new string s
  296.                             printf("%s", s);
  297.                             gotoxy(memX+1,y );
  298.                         } // else // to overwrite a character to string s
  299.                     } // if( ... )
  300.  
  301.                     break;
  302.         } // switch( c_choice )
  303.     } // while( 1 )
  304. } // edit_string()
  305.  
  306.  
  307. int main(void)
  308. {
  309.     int x=10, y=5, fc=9, bc=11;
  310.  
  311.     char str[] = "This is string to be edited.";
  312.  
  313.     gotoxy(x-1,y-2);
  314.     printf("|%s|", str);
  315.  
  316.     edit_string( x, y, fc, bc, str );
  317.  
  318.     gotoxy(x-1,y+2);
  319.     printf("|%s| \n\n", str);
  320.  
  321.  
  322.     return 0;
  323.  
  324. } // main()
Advertisement
RAW Paste Data Copied
Advertisement