Deutsch

Командный интерпретатор 22.03.2025

22.03.25 03:15
Командный интерпретатор 22.03.2025
 
uscheswoi_82 патриот
Последний раз изменено 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;
}


Продолжение следует...

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
 

Перейти на