Subversion Repositories Kolibri OS

Rev

Rev 2174 | Rev 3245 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. /// ===========================================================
  3.  
  4. void command_clear()
  5. {
  6. for (;CMD_POS;CMD_POS--)
  7.         printf("%c %c", 8, 8);
  8. CMD[0]='\0';
  9. }
  10.  
  11. /// ===========================================================
  12.  
  13. void command_history_add(char command[])
  14. {
  15.  
  16. if (    (0 != strcmp( CMD_HISTORY[0], CMD)) &&
  17.         (0 != strcmp( CMD_HISTORY[1], CMD)) &&
  18.         (0 != strcmp( CMD_HISTORY[2], CMD)) &&
  19.         (0 != strcmp( CMD_HISTORY[3], CMD)) &&
  20.         (0 != strcmp( CMD_HISTORY[4], CMD)) )
  21.  
  22.         {
  23.         strcpy(CMD_HISTORY[4], CMD_HISTORY[3]);
  24.         strcpy(CMD_HISTORY[3], CMD_HISTORY[2]);
  25.         strcpy(CMD_HISTORY[2], CMD_HISTORY[1]);
  26.         strcpy(CMD_HISTORY[1], CMD_HISTORY[0]);
  27.  
  28.         strcpy(CMD_HISTORY[0], CMD);
  29.        
  30.         if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM)
  31.                 CMD_HISTORY_NUM_REAL++;
  32.        
  33.         }
  34.  
  35. }
  36.  
  37. /// ===========================================================
  38.  
  39. void command_get()
  40. {
  41. unsigned key;
  42. //unsigned pos = 0;
  43. int hist;
  44.  
  45. CMD_POS = 0;
  46. CMD_NUM = 0;
  47.  
  48. for (;;)
  49.         {
  50.         key = getch();
  51.         if ( 0 != (key & 0xff) )
  52.                 {
  53.                 key &= 0xff;
  54.                 switch (key)
  55.                         {
  56.                         case 27: // ESC
  57.                                 command_clear();
  58.                                 break;
  59.  
  60.                         case 13: // ENTER
  61.                                 CMD[CMD_POS] = '\0';
  62.                                 printf("\n\r");
  63.  
  64.                                 command_history_add(CMD);
  65.                                 return;
  66.  
  67.                         case 8: // BACKSPACE
  68.                                 if (CMD_POS > 0)
  69.                                         {
  70.                                         printf ("%c %c", 8, 8);
  71.                                         CMD_POS--;
  72.                                         }
  73.                                 break;
  74.  
  75.                         case 9: // TAB
  76.                                 break;
  77.  
  78.                         default:
  79.                                 if (CMD_POS < 255)
  80.                                         {
  81.                                        
  82.                                         if ( kol_key_control() & 0x40 ) // åñëè âêëþ÷¸í CapsLock
  83.                                                 if ( (kol_key_control() & 1) || (kol_key_control() & 2)) // åñëè íàæàòû øèôòû
  84.                                                         key = tolower(key);
  85.                                                 else
  86.                                                         key = toupper(key);
  87.  
  88.                                         CMD[CMD_POS] = key;
  89.                                         CMD_POS++;
  90.                                         printf("%c", key);
  91.                                         }
  92.                                         break;
  93.                         };
  94.                 }
  95.         else    // îáðàáîòêà ðàñøèðåííûõ êëàâèø
  96.                 {
  97.                 key = (key>>8)&0xff;
  98. //              printf ("%d\n\r", key);
  99.  
  100.                 switch (key)
  101.                         {
  102.  
  103.                         case 72: // UP
  104.                                 for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
  105.                                         {
  106.                                         command_clear();
  107.  
  108.                                         if (CMD_NUM < CMD_HISTORY_NUM-1)
  109.                                                 CMD_NUM++;
  110.                                         else
  111.                                                 CMD_NUM = 0;
  112.                                
  113.                                         printf( CMD_HISTORY[CMD_NUM] );
  114.                                         strcpy(CMD, CMD_HISTORY[CMD_NUM]);
  115.                                         if ((CMD_POS = strlen(CMD)) != 0)
  116.                                                 break;
  117.                                         }
  118.  
  119.                                 break;
  120.  
  121.                         case 80: // DOWN
  122.                                 for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
  123.                                         {
  124.                                         command_clear();
  125.  
  126.                                         if (CMD_NUM > 0)
  127.                                                 CMD_NUM--;
  128.                                         else
  129.                                                 CMD_NUM = CMD_HISTORY_NUM-1;
  130.  
  131.                                         printf( CMD_HISTORY[CMD_NUM] );
  132.                                         strcpy(CMD, CMD_HISTORY[CMD_NUM]);
  133.                                         if ((CMD_POS = strlen(CMD)) != 0)
  134.                                                 break;
  135.                                         }
  136.                                 break;
  137.  
  138.                         case 0: // console window closed
  139.                                 cmd_exit(NULL);
  140.  
  141.                         };
  142.                 }
  143.                
  144.         }
  145. }
  146.  
  147.  
  148.  
  149. /// ===========================================================
  150.  
  151. int command_get_cmd(char cmd[])
  152. {
  153. unsigned i;
  154. for (i=0;;i++)
  155.         {
  156.         cmd[i] = CMD[i];
  157.         if (0 == cmd[i])
  158.                 {
  159.                 i = -2;
  160.                 break;
  161.                 }
  162.         if ( iswhite(cmd[i]) )
  163.                 {
  164.                 cmd[i] = '\0';
  165.                 break;
  166.                 }
  167.         }
  168. return i+1;
  169. }
  170.  
  171. /// ===========================================================
  172.  
  173. typedef void (*handler1_t)(char* arg);
  174.  
  175. /// ===========================================================
  176.  
  177. void command_execute()
  178. {
  179. char cmd[256];
  180. char args[256];
  181. unsigned arg;
  182. int i;
  183.  
  184. trim(CMD);
  185. arg = command_get_cmd(cmd);
  186.  
  187. if ( !strlen(cmd) )
  188.         return;
  189.  
  190. strcpy(args, CMD+arg);
  191. trim(args);
  192.  
  193. for (i = 0; i < NUM_OF_CMD; i++)
  194.         {
  195.         if (!strcmp(cmd, COMMANDS[i].name))
  196.                 {
  197.                 ((handler1_t)COMMANDS[i].handler)(args);
  198.                 return;
  199.                 }
  200.         }
  201.  
  202.  
  203. if ( -1 != alias_search(CMD) )
  204.         {
  205.         strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
  206.         command_execute();
  207.         return;
  208.         }
  209.  
  210. executable_run(cmd, args);
  211.  
  212. }
  213.  
  214. /// ===========================================================
  215.