/programs/system/shell/modules/module_alias.c |
---|
0,0 → 1,126 |
/// =========================================================== |
int alias_check(char alias[]) |
{ |
unsigned i; |
char buf1[256]; |
char buf2[256]; |
if ( !alias_split (alias, buf1, buf2)) |
return FALSE; |
for (i = 0; i < NUM_OF_CMD; i++) |
if ( !strcmp(COMMANDS[i].name, buf1) ) |
return -1; |
if (NULL == ALIASES) |
return FALSE; |
for (i = 0; i < ALIAS_NUM; i++) |
{ |
if ( !strcmp(ALIASES+256*i, buf1) ) |
return FALSE; |
} |
return TRUE; |
} |
/// =========================================================== |
int alias_search(char alias[]) |
{ |
unsigned i; |
for (i = 0; i < ALIAS_NUM; i++) |
{ |
if ( !strcmp(ALIASES+256*i, alias) ) |
return i; |
} |
return -1; |
} |
/// =========================================================== |
int alias_add(char alias[]) |
{ |
char buf1[256]; |
char buf2[256]; |
if ( ALIAS_NUM > 255) |
return FALSE; |
if ( !alias_split (alias, buf1, buf2)) |
return FALSE; |
strcpy (ALIASES+256*ALIAS_NUM, buf1); |
strcpy (ALIASES+256*ALIAS_NUM+64*1024, buf2); |
ALIAS_NUM++; |
return TRUE; |
} |
/// =========================================================== |
void alias_list() |
{ |
unsigned i; |
if ( 0 == ALIAS_NUM) |
return; |
for (i = 0; i < ALIAS_NUM; i++) |
printf (" %s=%s\n\r",ALIASES+256*i, ALIASES+256*i+64*1024); |
} |
/// =========================================================== |
int alias_split (char alias[], char s1[], char s2[]) |
{ |
unsigned i, j; |
if (NULL == strchr(alias, '=')) |
return FALSE; |
for (i=0, j = 0;; i++) |
{ |
if ('=' == alias[i]) |
{ |
s1[i]='\0'; |
break; |
} |
s1[i]=alias[i]; |
} |
j = 0; |
for (;; i++, j++) |
{ |
s2[j]=alias[i]; |
if ('\0' == alias[i]) |
break; |
} |
trim(s1); |
for (i=0;;i++) |
{ |
s2[i] = s2[i+1]; |
if ('\0' == s2[i] ) |
break; |
} |
trim(s2); |
return TRUE; |
} |
/// =========================================================== |
/programs/system/shell/modules/module_command.c |
---|
0,0 → 1,203 |
/// =========================================================== |
void command_clear() |
{ |
for (;CMD_POS;CMD_POS--) |
printf("%c %c", 8, 8); |
CMD[0]='\0'; |
} |
/// =========================================================== |
void command_history_add(char command[]) |
{ |
if ( (0 != strcmp( CMD_HISTORY[0], CMD)) && |
(0 != strcmp( CMD_HISTORY[1], CMD)) && |
(0 != strcmp( CMD_HISTORY[2], CMD)) && |
(0 != strcmp( CMD_HISTORY[3], CMD)) && |
(0 != strcmp( CMD_HISTORY[4], CMD)) ) |
{ |
strcpy(CMD_HISTORY[4], CMD_HISTORY[3]); |
strcpy(CMD_HISTORY[3], CMD_HISTORY[2]); |
strcpy(CMD_HISTORY[2], CMD_HISTORY[1]); |
strcpy(CMD_HISTORY[1], CMD_HISTORY[0]); |
strcpy(CMD_HISTORY[0], CMD); |
} |
} |
/// =========================================================== |
void command_get() |
{ |
unsigned key; |
//unsigned pos = 0; |
int hist; |
CMD_POS = 0; |
CMD_NUM = 0; |
for (;;) |
{ |
key = getch(); |
if ( 0 != (key & 0xff) ) |
{ |
key &= 0xff; |
switch (key) |
{ |
case 27: // ESC |
command_clear(); |
break; |
case 13: // ENTER |
CMD[CMD_POS] = '\0'; |
printf("\n\r"); |
command_history_add(CMD); |
return; |
case 8: // BACKSPACE |
if (CMD_POS > 0) |
{ |
printf ("%c %c", 8, 8); |
CMD_POS--; |
} |
break; |
case 9: // TAB |
break; |
default: |
if (CMD_POS < 255) |
{ |
CMD[CMD_POS] = key; |
CMD_POS++; |
printf("%c", key); |
} |
break; |
}; |
} |
else // îáðàáîòêà ðàñøèðåííûõ êëàâèø |
{ |
key = (key>>8)&0xff; |
// printf ("%d\n\r", key); |
switch (key) |
{ |
case 72: // UP |
for (hist = 0; hist < CMD_HISTORY_NUM; hist++) |
{ |
command_clear(); |
if (CMD_NUM < CMD_HISTORY_NUM-1) |
CMD_NUM++; |
else |
CMD_NUM = 0; |
printf( CMD_HISTORY[CMD_NUM] ); |
strcpy(CMD, CMD_HISTORY[CMD_NUM]); |
if ((CMD_POS = strlen(CMD)) != 0) |
break; |
} |
break; |
case 80: // DOWN |
for (hist = 0; hist < CMD_HISTORY_NUM; hist++) |
{ |
command_clear(); |
if (CMD_NUM > 0) |
CMD_NUM--; |
else |
CMD_NUM = CMD_HISTORY_NUM-1; |
printf( CMD_HISTORY[CMD_NUM] ); |
strcpy(CMD, CMD_HISTORY[CMD_NUM]); |
if ((CMD_POS = strlen(CMD)) != 0) |
break; |
} |
break; |
case 0: // console window closed |
cmd_exit(NULL); |
}; |
} |
} |
} |
/// =========================================================== |
int command_get_cmd(char cmd[]) |
{ |
unsigned i; |
for (i=0;;i++) |
{ |
cmd[i] = CMD[i]; |
if (0 == cmd[i]) |
{ |
i = -2; |
break; |
} |
if ( iswhite(cmd[i]) ) |
{ |
cmd[i] = '\0'; |
break; |
} |
} |
return i+1; |
} |
/// =========================================================== |
typedef void (*handler1_t)(char* arg); |
/// =========================================================== |
void command_execute() |
{ |
char cmd[256]; |
char args[256]; |
unsigned arg; |
int i; |
trim(CMD); |
arg = command_get_cmd(cmd); |
if ( !strlen(cmd) ) |
return; |
strcpy(args, CMD+arg); |
trim(args); |
for (i = 0; i < NUM_OF_CMD; i++) |
{ |
if (!strcmp(cmd, COMMANDS[i].name)) |
{ |
((handler1_t)COMMANDS[i].handler)(args); |
return; |
} |
} |
if ( -1 != alias_search(CMD) ) |
{ |
strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD)); |
command_execute(); |
return; |
} |
executable_run(cmd, args); |
} |
/// =========================================================== |
/programs/system/shell/modules/module_executable.c |
---|
0,0 → 1,60 |
/// =========================================================== |
int executable_run(char cmd[], char args[]) |
{ |
char exec[256]; |
char error_starting[]={" No such command '%s'.\n\r"}; |
int result; |
if ( '/' == cmd[0]) // åñëè ïóòü àáñîëáòíûé |
{ |
strcpy(exec, cmd); |
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà |
{ |
printf(error_starting, cmd); |
return FALSE; |
} |
} |
else |
{ |
strcpy(exec, cur_dir); // ïðîâåðÿåì ôàéë â òåêóùåì êàòàëîãå |
strcat(exec, cmd); |
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà |
{ |
strcpy(exec, "/rd/1/"); // ïðîâåðÿåì ôàéë íà âèðòóàëüíîì äèñêå |
strcat(exec, cmd); |
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà |
{ |
printf(error_starting, cmd); |
return FALSE; |
} |
} |
} |
if ( script_check(exec) ) |
{ |
return script_run(exec, args); |
} |
/* çàïóñê ïðîãðàììû */ |
result = program_run(exec, args); |
if (result > 0) |
{ |
printf (" '%s' started. PID = %d\n\r", cmd, result); |
return TRUE; |
} |
else |
{ |
printf(error_starting, cmd); |
return FALSE; |
} |
} |
/// =========================================================== |
/programs/system/shell/modules/module_program.c |
---|
0,0 → 1,16 |
int program_run(char cmd[], char param[]) |
{ |
kol_struct70 k70; |
k70.p00 = 7; |
k70.p04 = 0; |
k70.p08 = param; |
k70.p12 = 0; |
k70.p16 = 0; |
k70.p20 = 0; |
k70.p21 = cmd; |
return kol_file_70(&k70); |
} |
/programs/system/shell/modules/module_script.c |
---|
0,0 → 1,102 |
/// =========================================================== |
int script_check(char file[]) |
{ |
kol_struct70 k70; |
char buf[4]; |
k70.p00 = 0; |
k70.p04 = 0; |
k70.p08 = 0; |
k70.p12 = 4; // ÷èòàòü 4 áàéòà |
k70.p16 = buf; |
k70.p20 = 0; |
k70.p21 = file; |
kol_file_70(&k70); |
if ( !strcmp(buf, script_sign) ) |
return TRUE; |
else |
return FALSE; |
} |
/// =========================================================== |
int script_run(char exec[], char args[]) |
{ |
kol_struct70 k70; |
kol_struct_BDVK bdvk; |
unsigned result, filesize, pos, i; |
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò |
k70.p00 = 5; |
k70.p04 = k70.p08 = k70.p12 = 0; |
k70.p16 = &bdvk; |
k70.p20 = 0; |
k70.p21 = exec; |
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå |
if ( 0 != result ) |
return FALSE; |
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà |
buf = malloc(filesize+256); |
if (NULL == buf) |
return FALSE; |
buf[filesize]=0; |
k70.p00 = 0; |
k70.p04 = k70.p08 = 0; |
k70.p12 = filesize; |
k70.p16 = buf; |
k70.p20 = 0; |
k70.p21 = exec; |
result = kol_file_70(&k70); // ñ÷èòûâàåì ôàéë â áóôåð |
if ( 0 != result ) |
{ |
free(buf); |
return FALSE; |
} |
pos = 0; |
for (;;) // îáðàáîòêà ñêðèïòà |
{ |
if (pos > filesize) |
break; |
for (i=0;;i++) // ñ÷èòûâàíèå ñòðîêè |
{ |
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos])) |
{ |
pos++; |
CMD[i] = '\0'; |
break; |
} |
CMD[i] = buf[pos]; |
pos++; |
} |
if ( 0 == strlen(CMD) ) // ïóñòàÿ ñòðîêà |
continue; |
if ('#' == CMD[0]) // êîììåíòàðèé |
continue; |
command_execute(); |
} |
free(buf); |
return TRUE; |
} |
/// =========================================================== |
/programs/system/shell/modules/. |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |