русский

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

60  
uscheswoi_82 патриот22.03.25 03:15
22.03.25 03:15 
Zuletzt geändert 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;
}


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

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#1 
uscheswoi_82 патриот22.03.25 05:02
NEW 22.03.25 05:02 
in Antwort uscheswoi_82 22.03.25 03:15

Работает вот так:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#2 
uscheswoi_82 патриот22.03.25 23:00
NEW 22.03.25 23:00 
in Antwort uscheswoi_82 22.03.25 05:02

Короче в моей программе файл startup.int, запускается первый раз, при запуске командного интерпретатора для каких-нибудь настроек, это так-же как в MS-DOS при первом запуске запускались autoexec.bat и config.sys.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#3 
uscheswoi_82 патриот24.03.25 03:13
NEW 24.03.25 03:13 
in Antwort uscheswoi_82 22.03.25 23:00

Немножко добавил кода:

void convert_wrtime_to_hhmmss(unsigned short wrtime, int *hours, int *minutes, int *seconds) {    
  *hours = (wrtime >> 11) & 0x1F;
  *minutes = (wrtime >> 5) & 0x3F;    
  *seconds = (wrtime & 0x1F) * 2;
}



case 3:
  is_done = _dos_findfirst("*.*",_A_NORMAL,&ffblk);
  while(!is_done) {
    printf("%s", ffblk.name);
    gotoxy(13, wherey());
    printf("%ld", ffblk.size);
    gotoxy(13+9, wherey());
    convert_wrtime_to_hhmmss(ffblk.wr_time, &hours, &minutes, &seconds);
    printf("d:d:d\n", hours, minutes, seconds);
    is_done = _dos_findnext(&ffblk);
  }
break;



Результат работы кода, даём команду d:

? d
BC.BAT      65       02:35:48
INTERP.CPP  3838     01:40:08
INTERP.EXE  17927    03:08:22
INTERP.OBJ  4145     03:08:22
README.DOC  1700     06:11:34
STARTUP.INT 39       02:50:26
TC0000.SWP  262144   03:08:22
TEST.INT    16       01:35:36
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#4 
uscheswoi_82 патриот24.03.25 21:19
NEW 24.03.25 21:19 
in Antwort uscheswoi_82 24.03.25 03:13

Я немного поменял код, команда теперь называется dr:

char *cmd[] = {"CON", // 0
        "PRN",// 1
        "F",// 2
        "DR", // 3 Теперь DR для отображения файлов и директорий!!!
        "D",// 4
        "DEL",// 5
        "IF",// 6
        "Q.",// 7
        "MD",// 8
        "CD",// 9
        "FOR",// 10
        "WAIT",// 11
        "REM",// 12
        "VR",// 13
        "VAR",//14
        "BEEP",// 15
        "JMP",//16
        "CL",// 17
        "GXY",// 18
        "RET",// 19
        "ENUM",// 20
        "RUN",// 21
        "DR",// 22
        "ED",// 23
        "MSG",// 24
        "CAL",  // 25
        "none"};  // 26



Команда dr:

case 3:
  is_done = _dos_findfirst("*.*",_A_NORMAL,&ffblk);
  while(!is_done) {
    printf("%s", ffblk.name);
    gotoxy(14, wherey());
    printf("%ld", ffblk.size);
    gotoxy(14+9, wherey());
    convert_wrtime_to_hhmmss(ffblk.wr_time, &hours, &minutes, &seconds);
    printf("d:d:d\n", hours, minutes, seconds);
    is_done = _dos_findnext(&ffblk);
  }
break;



Результат работы команды dr:

C:\sanix_2025>bc.bat
Добро пожаловать в SanixOS v1.0
? dr
12345678.123 0        21:14:46
BC.BAT       65       02:35:48
INTERP.CPP   3895     21:15:22
INTERP.EXE   17970    21:15:30
INTERP.OBJ   4215     21:15:30
README.DOC   1700     06:11:34
STARTUP.INT  39       02:50:26
TC0000.SWP   262144   21:15:28
TEST.INT     16       01:35:36
?
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#5