Subversion Repositories Kolibri OS

Rev

Rev 2174 | 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.                                         CMD[CMD_POS] = key;
  78.                                         CMD_POS++;
  79.                                         printf("%c", key);
  80.                                         }
  81.                                         break;
  82.                         };
  83.                 }
  84.         else    // îáðàáîòêà ðàñøèðåííûõ êëàâèø
  85.                 {
  86.                 key = (key>>8)&0xff;
  87. //              printf ("%d\n\r", key);
  88.  
  89.                 switch (key)
  90.                         {
  91.  
  92.                         case 72: // UP
  93.                                 for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
  94.                                         {
  95.                                         command_clear();
  96.  
  97.                                         if (CMD_NUM < CMD_HISTORY_NUM-1)
  98.                                                 CMD_NUM++;
  99.                                         else
  100.                                                 CMD_NUM = 0;
  101.                                
  102.                                         printf( CMD_HISTORY[CMD_NUM] );
  103.                                         strcpy(CMD, CMD_HISTORY[CMD_NUM]);
  104.                                         if ((CMD_POS = strlen(CMD)) != 0)
  105.                                                 break;
  106.                                         }
  107.  
  108.                                 break;
  109.  
  110.                         case 80: // DOWN
  111.                                 for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
  112.                                         {
  113.                                         command_clear();
  114.  
  115.                                         if (CMD_NUM > 0)
  116.                                                 CMD_NUM--;
  117.                                         else
  118.                                                 CMD_NUM = CMD_HISTORY_NUM-1;
  119.  
  120.                                         printf( CMD_HISTORY[CMD_NUM] );
  121.                                         strcpy(CMD, CMD_HISTORY[CMD_NUM]);
  122.                                         if ((CMD_POS = strlen(CMD)) != 0)
  123.                                                 break;
  124.                                         }
  125.                                 break;
  126.  
  127.                         case 0: // console window closed
  128.                                 cmd_exit(NULL);
  129.  
  130.                         };
  131.                 }
  132.                
  133.         }
  134. }
  135.  
  136.  
  137.  
  138. /// ===========================================================
  139.  
  140. int command_get_cmd(char cmd[])
  141. {
  142. unsigned i;
  143. for (i=0;;i++)
  144.         {
  145.         cmd[i] = CMD[i];
  146.         if (0 == cmd[i])
  147.                 {
  148.                 i = -2;
  149.                 break;
  150.                 }
  151.         if ( iswhite(cmd[i]) )
  152.                 {
  153.                 cmd[i] = '\0';
  154.                 break;
  155.                 }
  156.         }
  157. return i+1;
  158. }
  159.  
  160. /// ===========================================================
  161.  
  162. typedef void (*handler1_t)(char* arg);
  163.  
  164. /// ===========================================================
  165.  
  166. void command_execute()
  167. {
  168. char cmd[256];
  169. char args[256];
  170. unsigned arg;
  171. int i;
  172.  
  173. trim(CMD);
  174. arg = command_get_cmd(cmd);
  175.  
  176. if ( !strlen(cmd) )
  177.         return;
  178.  
  179. strcpy(args, CMD+arg);
  180. trim(args);
  181.  
  182. for (i = 0; i < NUM_OF_CMD; i++)
  183.         {
  184.         if (!strcmp(cmd, COMMANDS[i].name))
  185.                 {
  186.                 ((handler1_t)COMMANDS[i].handler)(args);
  187.                 return;
  188.                 }
  189.         }
  190.  
  191.  
  192. if ( -1 != alias_search(CMD) )
  193.         {
  194.         strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
  195.         command_execute();
  196.         return;
  197.         }
  198.  
  199. executable_run(cmd, args);
  200.  
  201. }
  202.  
  203. /// ===========================================================
  204.