Subversion Repositories Kolibri OS

Rev

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