Вход на сайт
Командный интерпретатор 22.03.2025
1325 просмотров
Перейти к просмотру всей ветки
Последний раз изменено 22.03.25 03:22 (uscheswoi_82)
Всем привет! Делаю командный интерпретатор:
Вот код interp.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 0
#define FALSE !TRUE
#define MAX_SUBSTR 10
#define MAX_CMD 15
#define MAX_BUFFER 512
char *cmd[] = {"CON", // 0
"PRN",// 1
"F",// 2
"D",// 3
"DEL",// 4
"IF",// 5
"Q.",// 6
"MD",// 7
"CD",// 8
"FOR",// 9
"WAIT",// 10
"REM",// 11
"VR",// 12
"VAR",//13
"BEEP",// 14
"JMP",//15
"CL",// 16
"GXY",// 17
"RET",// 18
"ENUM",// 19
"RUN",// 20
"DR",// 21
"ED",// 22
"MSG",// 23
"CAL", // 24
"none"}; // 25
/* См. https://groups.germany.ru/showmessage.pl?
Number=41060081&Board=12994140000001 */
char splits[MAX_SUBSTR][250];
int split_str(char *buf, char del, int idx) {
int j=0, i=0, k=-1;
for(j=0; j<idx; j++) splits[j][0] = '\0';
for(j=0; j<strlen(buf); j++) {
k++;
splits[ i ][k] = buf[j];
if(buf[j] == del) {
splits[ i ][k] = '\0';
i++;
k=-1;
}
}
splits[ i ][k+1] = '\0';
return i;
}
int main(void) {
char buf[MAX_BUFFER]; // Буфер для команды
char scr[MAX_BUFFER]; // Буфер для экрана
FILE *f; // Для файла
int i = 0; // Для цикла for
int is_new_line = FALSE; // Перенос строки?
int is_echo = FALSE; // Эхо?
int is_file = FALSE; // Читаем из файла?
f = fopen("STARTUP.INT", "r"); // Открываем файл startup.int
if(f != NULL) { is_file = TRUE; }
START:
while(1) {
if(is_file == FALSE) {
printf("\n? ");
gets(buf);
}
else {
fgets(buf, 512, f);
if(feof(f)) { fclose(f); is_file = FALSE; goto START; }
}
// Если команда Q., то выходим из файла или программы
if(strcmp(strupr(buf), "Q.") == 0) {
if(is_file == FALSE) exit(0);
else {
fclose(f);
goto START;
}
}
// Расщипляем строку на подстроки
split_str(buf, ' ', MAX_SUBSTR);
for(i=0; i<MAX_CMD; i++) {
if(strcmp(strupr(splits[0]), cmd[ i ]) == 0)
break;
}
switch(i) {
case 0:
//printf("\nCON");
// Перенос строки
if(strcmp(strupr(splits[1]), "NON") == 0) is_new_line = TRUE;
else if(strcmp(strupr(splits[1]), "EON") == 0) is_echo = TRUE; // Эхо
else {
strncpy(scr, buf+4, strlen(buf)-2);
printf("%s", scr);
}
break;
default:
f = fopen(buf, "r"); // Читаем из файла команды
if(f != NULL) {
is_file = TRUE;
goto START;
}
else
printf("\nНет такого файла или команды.");
break;
}
}
return 0;
}
Продолжение следует...
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
Моя ФЛ Он и Она
Моя ФЛ Он и Она
Назад