В детстве до 2000 года мне разрешали всего 1 час работы за компьютером, в 1996 году мне подарили книгу "Секреты программирования игр", и я прочитал книгу по Юниксу и меня вдховновила эта операционная система, вот сетевая версия, она подключается через COM-порт, это серверная часть, код с работой COM-порта взял из книжки "Секреты программирования игр":

// I N C L U D E S ///////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <bios.h>
#include <process.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <dir.h>
#include <dos.h>
#include <io.h>
//#include <graph.h>
// D E F I N E S ////////////////////////////////////////////////////////////
// registers in UART
#define SER_RBF 0 // the read buffer
#define SER_THR 0 // the write buffer
#define SER_IER 1 // the int. enable register
#define SER_IIR 2 // the int. identification register
#define SER_LCR 3 // control data config. and divisor latch
#define SER_MCR 4 // modem control reg.
#define SER_LSR 5 // line status reg.
#define SER_MSR 6 // modem status of cts, ring etc.
#define SER_DLL 0 // the low byte of baud rate divisor
#define SER_DLH 1 // the hi byte of divisor latch
// bit patterns for control registers
#define SER_BAUD_1200 96 // baud rate divisors for 1200 baud - 19200
#define SER_BAUD_2400 48
#define SER_BAUD_9600 12
#define SER_BAUD_19200 6
#define SER_GP02 8 // enable interrupt
#define COM_1 0x3F8 // base port address of port 0
#define COM_2 0x2F8 // base port address of port 1
#define SER_STOP_1 0 // 1 stop bit per character
#define SER_STOP_2 4 // 2 stop bits per character
#define SER_BITS_5 0 // send 5 bit characters
#define SER_BITS_6 1 // send 6 bit characters
#define SER_BITS_7 2 // send 7 bit characters
#define SER_BITS_8 3 // send 8 bit characters
#define SER_PARITY_NONE 0 // no parity
#define SER_PARITY_ODD 8 // odd parity
#define SER_PARITY_EVEN 24 // even parity
#define SER_DIV_LATCH_ON 128 // used to turn reg 0,1 into divisor latch
#define PIC_IMR 0x21 // pic's interrupt mask reg.
#define PIC_ICR 0x20 // pic's interupt control reg.
#define INT_SER_PORT_0 0x0C // port 0 interrupt com 1 & 3
#define INT_SER_PORT_1 0x0B // port 0 interrupt com 2 & 4
#define SERIAL_BUFF_SIZE 128 // current size of circulating receive buffer
//void interrupt ( *oldhandler)(__CPPARGS);
// G L O B A L S /////////////////////////////////////////////////////////////
void (_interrupt _far *Old_Isr)(); // holds old com port interrupt handler
char ser_buffer[SERIAL_BUFF_SIZE]; // the receive buffer
int ser_end = -1,ser_start=-1; // indexes into receive buffer
int ser_ch, char_ready=0; // current character and ready flag
int old_int_mask; // the old interrupt mask on the PIC
int open_port; // the currently open port
int serial_lock = 0; // serial ISR semaphore so the buffer
// isn't altered will it is being written
// to by the ISR
//////////////////////////////////////////////////////////////////////////////
void _interrupt _far Serial_Isr(void)
{
// this is the ISR (Interrupt Service Routine) for the com port. It is very
// simple. When it gets called, it gets the next character out of the receive
// buffer register 0 and places it into the software buffer. Note: C takes care
// of all the register saving and house work. Cool huh!
// lock out any other functions so the buffer doesn't get corrupted
serial_lock = 1;
// place character into next position in buffer
ser_ch = inp(open_port + SER_RBF);
// wrap buffer index around
if (++ser_end > SERIAL_BUFF_SIZE-1)
ser_end = 0;
// move character into buffer
ser_buffer[ser_end] = ser_ch;
++char_ready;
// restore PIC
outp(PIC_ICR,0x20);
// undo lock
serial_lock = 0;
} // end Serial_Isr
//////////////////////////////////////////////////////////////////////////////
int Ready_Serial()
{
// this functions returns true if there are any characters waiting and 0 if
// the buffer is empty
return(char_ready);
} // end Ready_Serial
//////////////////////////////////////////////////////////////////////////////
int Serial_Read()
{
// this function reads a character from the circulating buffer and returns it
// to the caller
int ch;
// wait for isr to end
while(serial_lock){}
// test if there is a character(s) ready in buffer
if (ser_end != ser_start)
{
// wrap buffer index if needed
if (++ser_start > SERIAL_BUFF_SIZE-1)
ser_start = 0;
// get the character out of buffer
ch = ser_buffer[ser_start];
// one less character in buffer now
if (char_ready > 0)
--char_ready;
// send data back to caller
return(ch);
} // end if a character is in buffer
else
// buffer was empty return a NULL i.e. 0
return(0);
} // end Serial_read
//////////////////////////////////////////////////////////////////////////////
void Serial_Write(char ch)
{
// this function writes a character to the transmit buffer, but first it
// waits for the transmit buffer to be empty. note: it is not interrupt
// driven and it turns of interrupts while it's working
// wait for transmit buffer to be empty
while(!(inp(open_port + SER_LSR) & 0x20)){}
// turn off interrupts for a bit
_asm cli
// send the character
outp(open_port + SER_THR, ch);
// turn interrupts back on
_asm sti
} // end Serial_Write
//////////////////////////////////////////////////////////////////////////////
void Open_Serial(int port_base, int baud, int configuration)
{
// this function will open up the serial port, set it's configuration, turn
// on all the little flags and bits to make interrupts happen and load the
// ISR
// save the port for other functions
open_port = port_base;
// first set the baud rate
// turn on divisor latch registers
outp(port_base + SER_LCR, SER_DIV_LATCH_ON);
// send low and high bytes to divsor latches
outp(port_base + SER_DLL, baud);
outp(port_base + SER_DLH, 0);
// set the configuration for the port
outp(port_base + SER_LCR, configuration);
// enable the interrupts
outp(port_base + SER_MCR, SER_GP02);
outp(port_base + SER_IER, 1);
// hold off on enabling PIC until we have the ISR installed
if (port_base == COM_1)
{
Old_Isr = _dos_getvect(INT_SER_PORT_0);
_dos_setvect(INT_SER_PORT_0, Serial_Isr);
}
else
{
Old_Isr = _dos_getvect(INT_SER_PORT_1);
_dos_setvect(INT_SER_PORT_1, Serial_Isr);
}
// enable interrupt on PIC
old_int_mask = inp(PIC_IMR);
outp(PIC_IMR, (port_base==COM_1) ? (old_int_mask & 0xEF) : (old_int_mask & 0xF7 ));
} // Open_Serial
//////////////////////////////////////////////////////////////////////////////
void Close_Serial(int port_base)
{
// this function closes the port which entails turning off interrupts and
// restoring the old interrupt vector
// disable the interrupts
outp(port_base + SER_MCR, 0);
outp(port_base + SER_IER, 0);
outp(PIC_IMR, old_int_mask );
// reset old isr handler
if (port_base == COM_1)
{
_dos_setvect(INT_SER_PORT_0, Old_Isr);
}
else
{
_dos_setvect(INT_SER_PORT_1, Old_Isr);
}
} // end Close_Serial
void PrintE (char *str) {
int j = 0 ;
for (j=0; j<strlen (str) ; j++)
{
Serial_Write (str[j]) ;
}
}
void PrintE2 (char *str, char *a1, char *a2, char *a3, char *a4) {
char *buf ;
sprintf (buf, "%s", str, a1, a2, a3, a4) ;
PrintE (buf) ;
}
//////////////////////////////////////////////////////////////////////////////
struct users {
int UserId ;
char username[11] ;
char password[11] ;
char systempolice[1024] ;
// char admin[3] ;
} usr ;
FILE *in ;
void OpenSystemFile () {
in = fopen ("d:\\sanix\\system.cfg", "r") ;
}
void CloseSystemFile () {
fclose (in) ;
}
// Поиск данных.
int FindUser () {
char buf[3000] ;
char *res ;
// 1024.
fgets (buf, 1044, in) ;
if (buf[strlen(buf)-1] == '\n')
buf[strlen(buf)-1] = '\0' ;
res = strtok (buf, ",") ;
usr.UserId = 0 ;
strcpy (usr.username, "") ;
strcpy (usr.password, "") ;
strcpy (usr.systempolice, "") ;
//strcpy (usr.admin, "") ;
if (res)
usr.UserId = atoi (res) ;
res = strtok (NULL, ",") ;
if (res)
strcpy (usr.username, res) ;
res = strtok (NULL, ",") ;
if (res)
strcpy (usr.password, res) ;
res = strtok (NULL, ",") ;
if (res)
strcpy (usr.systempolice, res) ;
/*res = strtok (NULL, ",") ;
if (res)
strcpy (usr.admin, res) ;*/
if (feof (in)) return 0 ;
return 1 ;
}
int WaitI (char str[23500]) {
char ch = 0;
int j = 0 ;
strcpy (str, "") ;
START:
ch = Serial_Read () ;
if (ch == '\n' || ch == '\r') goto START ;
ch = 0 ;
while (1)
{
if (kbhit ())
{
PrintE ("\nПрерывания пользователя.") ;
PrintE ("\nСервер закрывается...") ; //
PrintE ("\nКомандный интерпретатор закрывается..") ; //
PrintE ("\n\nТеперь консоль можно выключить.") ;
Close_Serial (COM_2) ;
exit (0) ;
}
if (ch == '')
{
PrintE ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ;
PrintE ("Произошло прерывания Саникс ПРО v1.0\n") ;
PrintE ("1. Отобразить список задач.\n") ;
PrintE ("2. Прервать задачу.\n") ;
PrintE ("3. Завершить сеанс.\n") ;
PrintE ("Выбор:\n") ;
switch (Serial_Read () )
{
case '1':
break ;
case '2':
}
}
if (ch == '') // 0x22
{
return -1 ;
}
if (j >= 280) j = 0 ;
if (ch != 0)
{
j++ ;
//delay (100) ;
//printf ("%c", ch) ;
}
ch = Serial_Read () ;
if (ch == '\r') { ch = '\n' ; break ; }
if (ch == '\n')
{
str[j+1] = '\0';
return 0 ;
// break ;
}
str[j] = ch ;
}
str[j+1] = '\0';
return 0 ;
}
FILE *in;
int error_level = 0 ; // ERRORLEVEL (Значение завершонной программы).
// Равносильно RET код (-32,768..+32,767).
int curr_in = 0 ;
char curr_path[MAXDIR] ; // Текущий путь
char labels[40][20] ; // Метки (максимум 40).
char vars[10][80] ; // Переменные #0..#9
char vars2[26] ; // Переменные #a..#z
char vals2[26][80]; // Значения (vars2[n]).
int lb_pos[40] ; // Позиция метdк.
int isSound = 0 ; // Звук ?
int jumps = 0 ; // Чтобы небыло зависаний.
char varibles[47][80] ; // Переменные среды для команды VAR.
char values[47][220] ; // Значения переменных сред для команды VAR.
char protectd[47] ; // Защищенны ли переменные среды от стирания (VAR CLEAR)?
int var_count = 0 ; // Кол-во переменных.
int lbl_count = 0 ; // Кол-во метк.
int secho = 0 ; // Эхо: secho = 1 - Да, 0 - Нет.
int snew = 0 ; // Переход на следующую строку : secho = 1 - Да, 0 - Нет.
int int_file = 0 ; // Пакетный файл или непосредственный ввод int_file = 2 - API ExecInterp (), 1 - Да, 0 - Нет ?
int iscmd = 0 ;
char *commands [] = {"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
char str2[4250] ; //
char splits[10][250]; // Расщипленное значение
char strng[80];
char buffer[80];
/* Из-за соображения безопасности я не использую INTERRUPT. */
int IsDeviceReady (int dev) {
struct diskinfo_t dinfo;
int result;
static char dbuf[512];
dinfo.drive = dev;
dinfo.head = 0;
dinfo.track = 0;
dinfo.sector = 1;
dinfo.nsectors = 1;
dinfo.buffer = dbuf;
RETRY:
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) != 0)
{
sprintf (str2, "Устройство %c: не готово\n", dev+'A') ;
PrintE (str2) ;
sprintf (str2, "1=Отменить 2=Повтор 3=Пропустить 4=Выход\n") ;
PrintE (str2) ;
RETR:
switch (getch ())
{
case '1':
return -1 ;
break ;
case '2':
goto RETRY ;
break ;
case '3':
return -2 ;
break ;
case '4':
// return 0 ;
exit (0) ;
break ;
default:
goto RETR ;
break ;
}
}
return 0 ;
}
void ToUpper (int idx) {
int i = 0 ;
for (i=0; i<strlen(splits[idx]); i++)
{
splits[idx][i] = toupper(splits[idx][i]);
}
}
char *GetFiles (int num, char *buf) {
int j = 0, i = 0, n = 0, m = 0 ;
char temp[80] ;
strcpy (temp, "") ;
for (j=0; j<strlen (buf); j++)
{
if (buf[j] == '{')
{
i = j ;
for (j=i; j<strlen (buf); j++)
{
temp[m] = buf[j] ;
m++ ;
if (buf[j] == ',')
{ // if (num = n)
if (num == n) return *temp ;
m = 0 ; n++ ;
}
}
}
}
}
char *GetFromBuf (int num, char *buf) {
int j = 0, i = 0, n = 0, m = 0 ;
char temp[80] ;
strcpy (temp, "") ;
for (j=0; j<strlen (buf); j++)
{
for (i=j; i<strlen (buf); i++)
{
if (buf[i] == ' ')
{
temp[m] = '\0' ;
if (num = n) return *temp ;
m = 0 ; n++ ;
}
temp[m] = buf[i] ;
m++ ;
}
}
}
void ToLower (int idx) {
int i = 0 ;
for (i=0; i<strlen(splits[idx]); i++)
{
splits[idx][i] = toupper(splits[idx][i]);
}
}
int SplitStr(char *buf, char spl, 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] == spl)
{
splits[i][k] = '\0';
i++;
k=-1;
}
}
splits[i][k+1] = '\0';
return i;
}
char *GetSplitted(int idx) {
return splits[idx];
}
char *GetSplittedExt2 (int idx) {
if (splits[idx][strlen(splits[idx])-1] == '\n') splits[idx][strlen(splits[idx])-1] = '\0';
return splits[idx];
}
char *GetSplittedExt(int idx) {
ToUpper (idx) ;
return splits[idx];
}
void prscr (char *str) {
PrintE (str) ;
}
void cls () {
PrintE ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ;
}
void inpkbd (char *str) {
if (int_file == 0)
{
RD:
if (WaitI (str) == -1)
{
PrintE ("Отмена\n") ;
goto RD ;
}
}
else
{
if (feof(in)) { int_file = 0; return ; }
fgets (str, 280, in) ;
str[strlen(str)-1] = '\0';
}
}
void kbdwai (void) { while (1) { if (Serial_Read () != 0) break ; } }
void echo (char *buf) {
int j=0, i=0;
for (j=0; j<strlen (buf); j++)
{
if (buf[j] == ' ') break ;
}
for (i=j+1; i<strlen (buf); i++)
{
if (buf[i] == '\7') { PrintE ("") ; }
else Serial_Write (buf[i]) ;
}
}
int GetLabel (char *buf) {
int j = 0 ;
for (j=0; j<40; j++)
{
if (strcmp (buf, labels[j]) == 0)
return j ;
}
return -1 ;
}
void ResetLabel (void) {
int j=0;
lbl_count = 0 ;
for (j=0; j<40; j++) { sprintf (labels[j], "") ; lb_pos[j] = 0 ; }
}
void SetLabel (char *buf, int pos) {
int j=0;
if (lbl_count >= 39) { PrintE ("Слишком много (меток) лейблов\n") ; lbl_count = 0 ; return ; }
for (j=0; j<strlen (buf); j++)
{
if (buf[j] != ':')
{
labels[lbl_count][j] = buf[j] ;
}
else
goto END;
}
END:
lb_pos[lbl_count] = pos ;
lbl_count ++ ;
}
int IsLabel (char *buf) {
int j=0;
for (j=0; j<strlen (buf); j++)
if (buf[j] == ' ') return -1 ;
for (j=strlen (buf); j>0; j--)
{
if (buf[j] == '\n' && buf[j-1] == ':' && j > 1 || buf[j] == '\0' && buf[j-1] == ':' && j > 1)
return 0;
}
return -1 ;
}
void ClearVar () {
int j=0;
var_count = 0 ;
for (j=0; j<40; j++)
{
varibles[j][0] = '\0';
values[j][0] = '\0';
}
}
int SetVar (char *var_name, char *value) {
if (var_count >= 39) return -1 ;
if (FindInVaribleExt (var_name) == -1)
{
if (protectd[var_count] == 0)
{
strcpy (varibles[var_count], var_name) ;
strcpy (values[var_count], value) ;
var_count++ ;
}
}
else
{
strcpy (values[FindInVarible(var_name)], value) ;
}
return 0 ; /// NEW
}
int SetVarExt (char *var_name, char *value) {
if (var_count >= 39) return -1 ;
if (FindInVaribleExt (var_name) == -1)
{
strcpy (varibles[var_count], var_name) ;
strcpy (values[var_count], value) ;
protectd[var_count] = 1 ;
var_count++ ;
}
}
int FindInVarible (char *var_name) {
int j = 0 ;
for (j=0; j<47; j++)
{
if (strcmp (var_name, varibles[j]) == 0)
return j ;
}
return -1 ;
}
int FindInVaribleExt (char *var_name) {
int j = 0 ;
for (j=0; j<40; j++)
{
if (strcmp (var_name, varibles[j]) == 0)
return j ;
}
return -1 ;
}
void SetGoto (long strng) {
int j=0;
char buf[80] ;
rewind (in) ;
for (j=0; j<strng; j++)
fgets (buf, 80, in) ;
}
void LoadLabels() {
int strng = 0 ;
int j = 0 ;
char buf[80] ;
rewind (in) ;
strng = 0 ;
while (1)
{
NEXT:
if (feof (in)) break ;
fgets (buf, 80, in) ;
if (IsLabel (buf) != -1)
{
SetLabel (buf, strng) ;
}
strng++;
}
rewind (in) ;
}
void UpdateThisVaribles () {
// 42 - Current Time
struct time t ;
struct date d ;
gettime (&t) ;
getdate (&d) ;
sprintf (values[42], "Текущее время: %02d:%02d:%02d.%02d\0", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund) ;
// 43 - Current Date
sprintf (values[43], "Текущая дата: %02d.%02d.%d", d.da_day, d.da_mon, d.da_year) ;
// 44 - Current Path
// 45 - Current Text (Keyboard);
// 46 - Version 1.0
// 47 - KBD
}
int GetFileType (char *fname) {
int sz=0;
sz = strlen (fname) ;
if (fname[sz-1] == 'm' && fname[sz-2] == 'o' && fname[sz-3] == 'c') return 1 ;
if (fname[sz-1] == 'n' && fname[sz-2] == 'u' && fname[sz-3] == 'r') return 2 ;
if (fname[sz-1] == 't' && fname[sz-2] == 'n' && fname[sz-3] == 'i') return 3 ;
if (fname[sz-1] == 'e' && fname[sz-2] == 'x' && fname[sz-3] == 'e') return 4 ;
if (fname[sz-1] == 'M' && fname[sz-2] == 'O' && fname[sz-3] == 'C') return 1 ;
if (fname[sz-1] == 'N' && fname[sz-2] == 'U' && fname[sz-3] == 'R') return 2 ;
if (fname[sz-1] == 'T' && fname[sz-2] == 'N' && fname[sz-3] == 'I') return 3 ;
if (fname[sz-1] == 'E' && fname[sz-2] == 'X' && fname[sz-3] == 'E') return 4 ;
return -1 ;
}
main (int argc, char **argv) {
{
FILE *fio ;
struct ftime ft;
int done = 0 ;
long files = 0 ;
long fsize = 0 ;
char ch ;
char login[10] ;
char passw[10] ;
int j = 0 ;
int i = 0 ;
int lines = 0 ;
int n = 0 ;
//long pos = 0 ;
char spls[280] ;
char con[280] ;
char buf[280] ;
char tbuf[28] ;
struct ffblk ffblk ;
clrscr () ;
printf ("Copyright(C) 2003-2004 ************* - САНИКС v1.0\n") ;
printf ("Кол-во подключаемых консолей:1\n") ;
printf ("\n") ;
//RESTART:
Open_Serial(COM_2,SER_BAUD_9600,SER_PARITY_NONE | SER_BITS_8 | SER_STOP_1);
for (j=0; j<10; j++) Serial_Read () ;
RESTART:
j= -1 ;
OpenSystemFile () ;
PrintE ("\nИмя?") ;
if (WaitI (login) == -1) goto RESTART ;
//login[j+1] = '\0' ;
ch = 0 ;
while (1)
{
if (FindUser () == 0)
goto RESTART ;
if (strcmp (login, usr.username) == 0)
{
PrintE ("\nПароль?") ;
if (WaitI (passw) == -1) goto RESTART ;
if (strcmp (passw, usr.password) == 0)
goto LOADING ;
else
goto ERR0 ;
}
}
{
ERR0:
PrintE ("\nНеверное имя или пароль!") ; //
CloseSystemFile () ;
goto RESTART ;
}
LOADING:
CloseSystemFile () ;
chdir (usr.systempolice) ;
cls () ;
PrintE ("Copyright(C) 2003-2004 ************* - САНИКС версия 1.00\n") ;
PrintE ("Запускается...\n") ;
delay (1000) ;
int_file = 1;
in = fopen ("d:\\sanix\\startup.all", "r") ;
if (in == NULL)
{
PrintE ("Файл: startup.all отсутсвует.\n") ;
PrintE ("Невозможно продолжить загрузку.\n") ;
PrintE ("Сейчас будит создан типичный startup.all.\n") ;
in = fopen ("d:\\sanix\\startup.all", "w") ;
fprintf (in, "%s", "REM NULL\nQ.\n") ;
fclose (in) ;
delay (1000) ;
delay (1000) ;
int_file = 0 ;
goto RESTART ;
}
cls () ;
LoadLabels () ;
FIRST:
strcpy (varibles[41], "$WELCOME") ;
varibles[41][strlen (varibles[41])] = '\0';
strcpy (values[41], "Командный интерпретатор для САНИКС Версия 1.0\nCopyright(C) 2003-2004 *************.\n") ;
strcpy (varibles[42], "$TIME") ;
strcpy (varibles[43], "$DATE") ;
strcpy (varibles[46], "$VER") ;
strcpy (values[46], "Интерпретатор для САНИКС: v1.00\n") ;
START:
if (argc > 1 && int_file == 0) { exit (0) ; }
if (feof (in)) { fclose (in) ; int_file = 0 ; }
if (int_file == 0)
{
if (strcmp(usr.systempolice, "ADMIN") == 0)
prscr (":") ;
else
prscr ("?") ;
}
else PrintE ("") ;
SECOND:
if (isSound == 1)
{
delay (200) ;
PrintE ("") ;
delay (200) ;
nosound () ;
isSound = 0 ;
}
if (iscmd == 1)
{
strcpy (buf, "") ;
if (argc == 3)
{
strcpy (buf, argv[2]) ;
iscmd = 0 ;
argc = 0 ;
}
else
{
for (i=2; i<argc+1; i++)
{
strcat (buf, argv[i]) ;
strcat (buf, " ") ;
}
}
}
else
inpkbd (buf) ;
if (secho == 1)
{
sprintf (str2, "%s\n", buf) ;
PrintE (str2) ;
}
if (strcmp (buf, "") == 0) goto START ;
EXECUTE:
SplitStr (buf, ' ', 7) ;
for (j=0; j<24; j++)
{
if (strcmp (GetSplittedExt (0), commands[j]) == 0)
{
if (j != 15) jumps = 0 ;
break;
}
}
switch (j)
{
case 0:
UpdateThisVaribles () ;
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("CON параметры\n") ;
PrintE ("Выполняет операции с консолью.\n") ;
PrintE ("CON CLS - Очистка экрана\n") ;
PrintE ("CON COLOR:фон,текст - Устанавливает цвет (Саникс v1.0 Про).\n") ;
PrintE ("CON FILE <имяфайла> - Загружает файл\n") ;
PrintE ("CON $CD - Отображает текущий путь\n") ;
PrintE ("CON CODE - Отображает код (0-255).\n") ;
PrintE ("CON переменная - Выводит переменную\n") ;
PrintE ("EON/EOFF - Эхо команд Вкл/Выкл. \n");
PrintE ("NON/NOFF - Перенос Вкл/Выкл. \n");
goto START;
}
if (strcmp (GetSplitted (1), "CODE") == 0)
{
sprintf (str2, "%c", atoi(GetSplitted(2))) ;
PrintE (str2) ;
if (snew == 1) PrintE ("\n") ;
goto START;
}
if (strcmp (GetSplitted (1), "FILE") == 0)
{
fio = fopen (GetSplitted(2), "r") ;
if (fio == NULL)
{
PrintE ("Файл не существует.\n") ;
goto START ;
}
while (1)
{
if (Serial_Read () == '') { fclose (fio) ; goto START ; }
// if (feof (fio)) break ;
fgets (str2, 80, in) ;
if (feof (fio)) break ;
PrintE (str2) ;
lines++ ;
if (lines >= 24) { WaitI (buf) ; lines=0 ; }
}
fclose (fio) ;
goto START ;
}
if (strcmp (GetSplitted (1), "EON") == 0) { secho = 1 ; goto START; }
if (strcmp (GetSplitted (1), "EOFF") == 0) { secho = 0 ; goto START; }
if (strcmp (GetSplitted (1), "NON") == 0) { snew = 1 ; goto START; }
if (strcmp (GetSplitted (1), "NOFF") == 0) { snew = 0 ; goto START; }
if (strcmp (GetSplittedExt (1), "$CD") == 0)
{
getcurdir(0, curr_path) ;
sprintf (str2, "%s", curr_path) ;
PrintE (str2) ;
if (snew == 1) PrintE ("\n") ;
goto START;
}
if (strcmp (GetSplittedExt (1), "CLS") == 0)
{
//
PrintE ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ;
goto START ;
}
if (strlen(GetSplitted (1)) != 0)
{
if (FindInVarible (GetSplitted (1)) != -1)
{
sprintf (str2, "%s", values[FindInVarible (GetSplitted (1))]) ;
PrintE (str2) ;
if (snew == 1)
PrintE ("\n") ;
goto START;
}
if (int_file == 1)
{
for (i=0; i<10; i++)
{
sprintf (spls, "#%d", i) ;
if (strcmp (GetSplitted (1), spls) == 0)
{
sprintf (str2, "%s", vars[i]) ;
PrintE (str2) ;
if (snew == 1)
PrintE ("\n") ;
goto START ;
}
}
}
if (strcmp (GetSplitted (1), "#ERRORLEVEL") == 0) { sprintf (str2, "%d\n", error_level) ; PrintE (str2) ; goto START ;}
echo (buf) ;
if (snew == 1)
PrintE ("\n") ;
goto START;
}
if (strlen (GetSplitted (1)) == 0)
{
PrintE ("Состояние ЭХО:") ;
if (secho == 1)
PrintE ("Включено") ;
else
PrintE ("Выключено") ;
PrintE (", перенос:") ;
if (snew == 1)
PrintE ("Есть") ;
else
PrintE ("Нет") ;
PrintE (".\n") ;
goto START ;
}
break ;
case 1:
break ;
case 2:
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("F [[диск:\][\директория\]]\имяфайла операция [[диск:\][\директория\]]\имяфайла [парам-ры]\n") ;
PrintE ("Производит операцию с файлами.\n") ;
PrintE ("Операции:\n") ;
PrintE ("> - Копировать файл.\n") ;
PrintE (">> - Перенести файл.\n") ;
PrintE ("Параметры:\n") ;
PrintE ("/REN Переименовать\n") ;
goto START ;
}
if (strlen (GetSplitted (1)) != 0 && strlen (GetSplitted (3)) != 0)
{
if (strcmp (GetSplitted (2), ">") == 0)
{
sprintf (str2, "Идет копирование файла: %s в %s.\n", GetSplitted (1), GetSplitted (3)) ;
PrintE (str2) ;
}
if (strcmp (GetSplitted (2), ">>") == 0)
{
sprintf (str2, "Идет перенос файла: %s в %s.\n", GetSplitted (1), GetSplitted (3)) ;
PrintE (str2) ;
}
goto START ;
}
break ;
case 3:
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("D [диск:\]\директория операция [диск:\]\директория [парам-ры]\n") ;
PrintE ("Производит операцию с директориями.\n") ;
PrintE ("Операции:\n") ;
PrintE ("> - Копировать директорию.\n") ;
PrintE (">> - Перенести директорию.\n") ;
PrintE ("Параметры:\n") ;
PrintE ("\n") ;
goto START ;
}
if (strlen (GetSplitted (1)) != 0 && strlen (GetSplitted (3)) != 0)
{
if (strcmp (GetSplitted (2), ">") == 0)
{
sprintf (str2, "Идет копирование директории: %s в %s.\n", GetSplitted (1), GetSplitted (3)) ;
PrintE (str2) ;
}
if (strcmp (GetSplitted (2), ">>") == 0)
{
sprintf (str2, "Идет перенос директории: %s в %s.\n", GetSplitted (1), GetSplitted (3)) ;
PrintE (str2) ;
}
goto START ;
}
break ;
case 5:
if (strlen (GetSplitted (1)) == 0)
{
PrintE ("Опущены параметры\n") ;
goto START ;
}
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("IF #переменная = Значение THEN метка\n") ;
PrintE ("IF $переменная = Значение THEN метка\n") ;
PrintE ("IF #FEXIST имя_файла.ext THEN метка\n") ;
PrintE ("IF #ERRORLEVEL число THEN метка\n") ;
PrintE ("Где #переменная = #0..#9\n") ;
goto START ;
}
if (int_file == 1)
{
if (strcmp (GetSplitted (1), "#ERRORLEVEL") == 0)
{
if (atoi (GetSplitted (2)) == error_level)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
if (strcmp (GetSplitted (1), "#NOTERRORLEVEL") == 0)
{
if (atoi (GetSplitted (2)) != error_level)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
if (strcmp (GetSplitted (1), "#FEXIST") == 0)
{
if (strlen (GetSplitted (2)) > 0)
{
if (fopen (GetSplitted (3), "r") != NULL)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
goto START ;
}
if (strcmp (GetSplitted (1), "#NOTFEXIST") == 0)
{
if (strlen (GetSplitted (2)) > 0)
{
if (fopen (GetSplitted (3), "r") == NULL)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
goto START ;
}
/////////////////////////////////////
if (splits[1][0] == '$')
{
if (strcmp (GetSplitted (2), "=") == 0)
{
if (strcmp (values[FindInVarible (GetSplitted (1))], GetSplitted (3)) == 0)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
if (strcmp (GetSplitted (2), "NOT") == 0)
{
if (strcmp (values[FindInVarible (GetSplitted (1))], GetSplitted (3)) != 0)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
/* printf ("Метка %s не найдена.\n", GetSplitted (5)) ;
goto START ;*/
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
goto START ;
}
for (i=0; i<10; i++)
{
sprintf (spls, "#%d", i) ;
// }
if (strcmp (GetSplitted (1), spls) == 0 && strcmp (GetSplitted (2), "=") == 0)
{
if (strcmp (vars[i], GetSplitted (3)) == 0)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
if (strcmp (GetSplitted (1), spls) == 0 && strcmp (GetSplitted (2), "NOT") == 0)
{
if (strcmp (vars[i], GetSplitted (3)) != 0)
{
if (GetLabel (GetSplittedExt2 (5)) == -1)
{
goto ERR ;
/* printf ("Метка %s не найдена.\n", GetSplitted (5)) ;
goto START ;*/
}
SetGoto (lb_pos[GetLabel (GetSplitted (5))]) ;
goto START ;
}
}
}
}
goto START ;
ERR:
sprintf (str2, "Метка '%s' не найдена.\n", GetSplitted (5)) ;
PrintE (str2) ;
goto START ;
/*IF errorcode = число THEN
IF !errorcode = число THEN
IF строка1 = строка2 THEN
IF !строка1 = строка2 THEN
IF FILE имя_файла THEN
IF !FILE имя_файла THEN
DO ENUM переменная IN файлы команда*/
break ;
case 6:
if (int_file == 1) { ResetLabel () ; int_file = 0 ; fclose (in) ; goto START; }
if (int_file == 0) { chdir ("C:\\") ; chdir ("c:\\sanix") ; }
goto RESTART ;
break ;
case 7:
if (strlen (GetSplitted (1)) == 0)
{
PrintE ("Опущены параметры\n") ;
goto START ;
}
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("MD <путь>\\имя_каталога.рас\n") ;
goto START ;
}
if (!mkdir (GetSplitted (1)))
{
sprintf (str2, "Каталог %s создан.\n", GetSplitted (1)) ;
PrintE (str2) ;
goto START ;
}
else
{
sprintf (str2, "Каталог %s не создан.", GetSplitted (1)) ;
PrintE (str2) ;
goto START ;
}
break ;
case 8:
if (strlen (GetSplitted (1)) == 0)
{
getcurdir(0, curr_path) ;
sprintf (str2, "%s", curr_path) ;
PrintE (str2) ;
if (snew == 1) PrintE ("\n") ;
goto START;
}
if (strcmp (GetSplitted (1), "\?") == 0)
{
PrintE ("CD <путь>\n") ;
PrintE ("Переходит на указанный путь.\n") ;
goto START ;
}
chdir (GetSplitted (1)) ;
goto START ;
break ;
case 10:
PrintE ("Нажми любую клавишу . . .\n") ;
PrintE ("\n") ;
WaitI (buf) ;
goto START ;
break ;
case 11:
goto START ;
break ;
case 12:
//printf ("\nCON VER\n%s\n", values[FindInVarible ("VER")]) ;
sprintf (str2, "%s\n", values[FindInVarible ("$VER")]) ;
PrintE (str2) ;
break ;
case 13:
if (strlen(GetSplitted (1)) == 0) { PrintE ("Опущены параметры\n") ; goto START; }
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("VAR $имя значение\n") ;
PrintE ("VAR $имя значение CONST\n") ;
PrintE ("VAR CLEAR - Очистка переменных\n") ;
PrintE ("VAR $KEY - Ожидание ввода строки\n") ;
PrintE ("VAR #KEY - Ожидание ввода строки\n") ;
PrintE ("VAR $KBD - Ожидание ввода клавиши\n") ;
PrintE ("VAR FREE - Информация свободных переменных\n") ;
PrintE ("VAR $TIME - Установка времени\n") ;
PrintE ("VAR $DATE - Установка даты\n") ;
goto START;
}
if (strcmp (GetSplitted (1), "$KBD") == 0)
{
strcpy (varibles[47], "$KBD") ;
values[47][0] = getch () ;
values[47][1] = '\0';
goto START ;
}
if (strcmp (GetSplitted (1), "$TIME") == 0)
{
PrintE ("Введите время:") ;
goto START ;
}
if (strcmp (GetSplitted (1), "$DATE") == 0)
{
PrintE ("Введите дату:") ;
goto START ;
}
if (strcmp (GetSplitted (1), "FREE") == 0)
{
sprintf (str2, "Свободных переменных:%d\n", 40-var_count) ;
PrintE (str2) ;
goto START ;
}
if (strcmp (GetSplitted (1), "$KEY") == 0)
{
strcpy (varibles[45], "$KEY") ;
WaitI (values[45]) ;
goto START ;
}
if (strcmp (GetSplitted (1), "CLEAR") == 0) { ClearVar () ; goto START; }
if (strlen (GetSplitted (1)) != 0 && strlen (GetSplitted (2)) != 0)
{
if (splits[1][0] != '$') goto START ;
if (strcmp (GetSplitted(3), "CONST") == 0)
SetVarExt (GetSplitted (1), GetSplitted (2)) ;
else
SetVar (GetSplitted (1), GetSplitted (2)) ;
goto START;
}
break ;
case 14:
if (strlen (GetSplitted (1)) == 0) { isSound = 1 ; goto START ; }
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("BEEP\n") ;
PrintE ("BEEP Частота Задержка\n") ;
PrintE ("Выводит звуковой сигнал на встроенный динамик\n") ;
goto START ;
}
if (splits[1][0] >= '0' && splits[1][0] <= '9' && splits[2][0] >= '0' && splits[2][0] <= '9')
{
//sound (atoi (GetSplitted (1))) ;
PrintE ("") ;
delay (atoi (GetSplitted (2))) ;
nosound () ;
goto START ;
}
break;
case 15:
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("JMP метка\n") ;
PrintE ("Переходит на указанную метку.\n") ;
PrintE ("Только для выполнения из пакетного файла.\n") ;
goto START ;
}
if (int_file == 1)
{
if (Serial_Read () == '') { int_file = 0 ; PrintE ("Аварийное прерывание\n") ; goto START ; }
/* jumps ++ ;
if (jumps > 20)
{
PrintE ("Цикл бесконечный прервать выполнения? (1=Да 2=Нет):\n") ;
switch (getch ())
{
case '1':
int_file = 0 ;
// printf ("\n") ;
goto START ;
break ;
default:
jumps = 0 ;
break ;
}
}*/
if (GetLabel (GetSplitted (1)) == -1)
{
sprintf (str2 , "Метка %s не найдена.\n", GetSplitted (1)) ;
PrintE (str2) ;
goto START ;
}
SetGoto (lb_pos[GetLabel (GetSplitted (1))]) ;
goto START ;
}
PrintE ("Требуется пакетный файл.\n") ;
goto START ;
break ;
case 16:
cls () ;
break ;
case 17:
if (strlen (GetSplitted(1)) == 0)
{
PrintE ("Опущены параметры\n") ;
goto START ;
}
if (strcmp (GetSplitted(1), "\?") == 0)
{
PrintE ("GXY x y\n") ;
PrintE ("Переводит курсор на позицию x, y.") ;
}
// if (int_file == 1) gotoxy (atoi (GetSplitted(1)), atoi (GetSplitted(2))) ;
goto START ;
break ;
case 18:
if (strlen (GetSplitted (1)) == 0)
{
PrintE ("Опущены параметры\n") ;
goto START ;
}
if (int_file == 1) error_level = atoi (GetSplitted(1)) ;
goto START ;
break ;
case 19:
// ENUM #переменная {файлы} DO команда.
if (strlen (GetSplitted (1)) == 0 && splits[1][0] != '#')
{
PrintE ("Опущены параметры\n") ;
goto START ;
}
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("ENUM #переменная {файлы} DO команда [параметры].\n") ;
PrintE ("Начинает выполнять команды в зависимости от количества файлов, и \n") ;
PrintE ("подставляет имя файла в #переменная.\n") ;
PrintE ("Пример:ENUM #a {*.exe} DO con #a\n") ;
goto START ;
}
if (splits[1][0] == '#' && splits[1][1] > 0)
{
for (i=0; i<255; i++) vars2[i] = 0 ;
vars2[splits[1][1]] = 1 ;
strcpy (buf, GetSplitted(5)) ;
GetFiles (1, GetSplitted(3)) ;
// done = findfirst("*.*",&ffblk,0);
// vals[] ;
}
break ;
case 20:
n = 0 ;
strcpy (tbuf, "") ;
for (i=4; i<strlen (buf) ; i++)
{
NEXT:
if (buf[i] == ' ')
{
strcat (tbuf, " ") ;
n = i ;
for (j=strlen (tbuf) + 1 ; j< strlen (buf) ; j++)
{
if (buf[j] == ' ') { i++ ; goto NEXT ; }
tbuf[j] = buf[n] ;
n++ ;
}
// n ++ ;
}
if (buf[i] == '#')
{
for (j=0; j<10; j++)
{
if(buf[i+1] == j+'0')
{
strcat (tbuf, vars[j]) ;
}
}
// for (j=i ; j<strlen (buf) ; j++)
}
}
/* strcpy (buf, tbuf) ;
printf ("%s %s", buf, tbuf) ;*/
goto EXECUTE ;
break ;
case 21:
fsize = 0 ;
files = 0 ;
lines = 0 ;
if (strlen (GetSplitted (1)) == 0)
{
getcurdir(0, curr_path) ;
sprintf (str2, "Текущий каталог: %s\n", curr_path) ;
PrintE (str2) ;
sprintf (str2, "Владелиц : %s\n", usr.username) ;
PrintE (str2) ;
if (strlen (GetSplitted (1)) == 0) done = findfirst("*.*",&ffblk, FA_DIREC);
if (strlen (GetSplitted (1)) != 0) done = findfirst(GetSplitted (1),&ffblk,0);
while (!done)
{
// if (ffblk.attrib = 0)
if (++lines == 23) { PrintE ("Нажмите любую клавишу...") ; WaitI (buf) ; lines = 0 ; }
if (strcmp (ffblk.ff_name, ".") != 0 || strcmp (ffblk.ff_name, "..") != 0)
{
files ++ ;
sprintf(str2," %12s %11ld", ffblk.ff_name, ffblk.ff_fsize);
if (ffblk.ff_attrib == FA_DIREC)
{
files -- ;
sprintf(str2," %12s %11s", ffblk.ff_name, "<ДИР>");
}
fsize = fsize + ffblk.ff_fsize ;
PrintE (str2) ;
fio = fopen (ffblk.ff_name, "r") ;
getftime (fileno (fio), &ft) ;
fclose (fio) ;
sprintf (str2, " %02d.%02d.%02d %02d:%02d:%02d\n", ft.ft_day, ft.ft_month, ft.ft_year, ft.ft_hour, ft.ft_min, ft.ft_tsec * 2) ;
PrintE (str2) ;
// delay (100) ;
}
done = findnext(&ffblk);
}
sprintf (str2, "Файлов : %ld, Размер: %ld\n\n", files, fsize) ;
PrintE (str2) ;
goto START ;
}
break ;
case 22:
if (int_file == 1) { PrintE ("В состояние выполнения пакетного файла невозможно редактировать.\n") ; goto START ; }
if (strlen (GetSplitted (1)) == 0)
{
PrintE ("ED <имя_файл.рас>\n") ;
goto START ;
}
fio = fopen (GetSplitted (1), "w") ;
PrintE ("Для выхода введите команду q. и нажмите <ENTER>.") ;
while (1)
{
PrintE ("\n~") ; // PrintE ("\n~") ;
WaitI (buf) ;
if (strcmp (buf, "q.") == 0) { fclose (fio) ; break ; }
fprintf (fio, "%s", buf) ;
}
break ;
case 23:
if (strlen (GetSplitted (1)) == 0)
{
PrintE ("Опущены параметры\n") ;
goto START ;
}
if (strcmp (GetSplitted (1), "/?") == 0)
{
PrintE ("MSG <Имя компьютера>\n") ;
PrintE ("MSG Выводит сообщение\n") ;
goto START ;
}
if (strcmp (GetSplitted (1), "main") == 0)
{
PrintE ("Сообщение:") ;
WaitI (buf) ;
sound (500) ;
delay (500) ;
sound (600) ;
delay (500) ;
nosound () ;
printf ("%s\n", buf) ;
gotoxy (1, 4) ;
goto START ;
}
break ;
default:
if (int_file == 1)
{
if (IsLabel (buf) != -1) goto START;
if (strcmp (GetSplitted (1), "device") == 0)
{
// ...
}
}
switch(GetFileType(GetSplitted (0)))
{
case 1: // com
break ;
case 2: // run
break ;
case 3: // int
fclose (in) ;
// curr_in--;
in = fopen (GetSplitted(0), "r") ;
int_file = 1 ;
if (in == NULL) {int_file = 0 ; goto GERR ; }
i = getc (in) ;
if (feof (in)) { sprintf (str2, "Ошибка в файле '%s'. ", GetSplitted(0)) ; fclose (in) ; int_file = 0 ; PrintE (str2) ; PrintE ("\n") ; goto START ; }
rewind (in) ;
ResetLabel () ;
LoadLabels () ;
curr_in++ ;
for (i=0; i<10; i++)
sprintf (vars[i], "") ;
for (i=0; i<10; i++)
strcpy (vars[i], GetSplitted(i)) ;
if (in != NULL) { int_file = 1 ; goto START ; } // { printf ("Не могу открыть файл:%s\n", buf) ; goto START ; }
// else { int_file = 1 ; goto START ; }
break ;
case 4: // exe
system (buf) ;
goto START ;
break ;
}
GERR:
PrintE ("Команда или файл не найден.\n");
if (int_file == 1) { sprintf (str2, "%s\n", buf) ; PrintE (str2) ; }
break ;
}
goto START;
Close_Serial(COM_2);
} // end main
}