Update and reorganize
This commit is contained in:
parent
143979c5b4
commit
9465097aa5
|
@ -1,3 +1,3 @@
|
||||||
## Practice
|
# Practice
|
||||||
|
|
||||||
Bunch of crappy code I wrote for practicing which serves no purpose.
|
Bunch of crappy code I wrote for practicing which serves no purpose.
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
project(TuringMachine C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
|
||||||
|
include_directories(.)
|
||||||
|
|
||||||
|
add_executable(TuringMachine main.c declaration.h command.c description.c index.c menu.c run.c)
|
|
@ -0,0 +1,80 @@
|
||||||
|
#include "declaration.h"
|
||||||
|
|
||||||
|
void loadCommand(turing *t, char *nameFile) {
|
||||||
|
FILE *in;
|
||||||
|
in = fopen(nameFile, "r");
|
||||||
|
if (in == NULL) {
|
||||||
|
printf("The file '%s' was not opened", nameFile);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nCommands:\n");
|
||||||
|
int commandNumb = 1, N = 0;
|
||||||
|
t->commands = malloc((N + 1) * sizeof(command));
|
||||||
|
int numb;
|
||||||
|
while (fscanf(in, "%d. ", &numb) != EOF) {
|
||||||
|
command tran;
|
||||||
|
char symbol1, symbol2, dir, state1, state2;
|
||||||
|
|
||||||
|
if (numb <= 0) {
|
||||||
|
printf("Error in '%s' file. There may only be commands from [1...] interval \n", nameFile);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (numb != commandNumb) {
|
||||||
|
printf("Error in '%s' file. Command numbers must be in order \n", nameFile);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
commandNumb++;
|
||||||
|
|
||||||
|
fscanf(in, "%c ", &state1);
|
||||||
|
fscanf(in, "%c ", &symbol1);
|
||||||
|
fscanf(in, "%c ", &symbol2);
|
||||||
|
fscanf(in, "%c ", &dir);
|
||||||
|
fscanf(in, "%c", &state2);
|
||||||
|
|
||||||
|
tran.number = numb;
|
||||||
|
tran.state1 = stateIndex(t, state1);
|
||||||
|
|
||||||
|
if (tran.state1 == -1) {
|
||||||
|
printf("Error in '%s' file", nameFile);
|
||||||
|
printf("\nIn the command %d, state %c isn't contained in the set of states of your Turing machine", numb,
|
||||||
|
state1);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
tran.symbol1 = symbolIndex(t, symbol1);
|
||||||
|
if (tran.symbol1 == -1) {
|
||||||
|
printf("\nError in '%s' file", nameFile);
|
||||||
|
printf("\nIn the commnand %d, symbol %c isn't contained in the alphabet of your Turing machine", numb,
|
||||||
|
symbol1);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
tran.symbol2 = symbolIndex(t, symbol2);
|
||||||
|
if (tran.symbol2 == -1) {
|
||||||
|
printf("\nError in 'command.txt' file");
|
||||||
|
printf("\nIn the commnand %d, symbol %c isn't contained in the alphabet of your Turing machine", numb,
|
||||||
|
symbol2);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
tran.dir = dir;
|
||||||
|
tran.state2 = stateIndex(t, state2);
|
||||||
|
if (tran.state2 == -1) {
|
||||||
|
printf("\nError in '%s' file", nameFile);
|
||||||
|
printf("\nIn the command %d, state %c isn't contained in the set of states of your Turing machine", numb,
|
||||||
|
state2);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
t->commands[N] = tran;
|
||||||
|
printf("%d. %c %c %c %c %c\n", numb, state1, symbol1, symbol2, dir, state2);
|
||||||
|
N++;
|
||||||
|
t->commands = realloc(t->commands, (N + 1) * sizeof(command));
|
||||||
|
}
|
||||||
|
t->commandsNumb = N;
|
||||||
|
fclose(in);
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
1. a 1 1 R a
|
||||||
|
2. a 0 0 R a
|
||||||
|
3. a B B L b
|
||||||
|
4. b 0 1 L c
|
||||||
|
5. b 1 0 L b
|
||||||
|
6. b B 1 L S
|
||||||
|
7. c 0 0 L c
|
||||||
|
8. c B B R S
|
||||||
|
9. c 1 1 L c
|
|
@ -0,0 +1,51 @@
|
||||||
|
#ifndef DECLARATION_H
|
||||||
|
#define DECLARATION_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define ENTER 10
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int number;
|
||||||
|
int state1; //Тут сохраняется индекс состояния, при котором выплоняется команд, в массиве states
|
||||||
|
int symbol1; //Тут сохраняется индекс символа, при котором выплоняется команд, в массиве symbols
|
||||||
|
int symbol2; //Тут сохраняется индекс символа, который нужен записать в ячейку, в массиве symbols
|
||||||
|
char dir; //просто направление сдвига головки
|
||||||
|
int state2; //Тут сохраняется индекс состояния, в которое нужно перейти, в массиве states
|
||||||
|
} command;
|
||||||
|
|
||||||
|
typedef struct tapeT tapeT;
|
||||||
|
struct tapeT {
|
||||||
|
int symbol;
|
||||||
|
tapeT *left;
|
||||||
|
tapeT *right;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int statesNumb; // кол-во используемых состояний
|
||||||
|
char *states;//множество состояний
|
||||||
|
int symbolsNumb;// кол-во используемых символов
|
||||||
|
char *symbols;//альфавит
|
||||||
|
int state;// состояние в головке
|
||||||
|
int commandsNumb;//число команд
|
||||||
|
command *commands;//команды
|
||||||
|
tapeT *tape;// лента
|
||||||
|
} turing;
|
||||||
|
|
||||||
|
int menu(int lastNumb);
|
||||||
|
|
||||||
|
int stateIndex(turing *t, char state); //нахождение номер индекса состояния state в states
|
||||||
|
int symbolIndex(turing *t, char symbol); //нахождение номер индекса symbol в symbols
|
||||||
|
void loadCommand(turing *t, char *nameFile); //загрузка команд из текстового файла
|
||||||
|
|
||||||
|
command findCommand(turing *t, char stateCurrent, char symbolCurrent);//нахождение нужной команды из список всех команд
|
||||||
|
|
||||||
|
void run(turing *t, bool step, char *nameFile);
|
||||||
|
|
||||||
|
void loadDescription(turing *t, char *nameFile); //загрузка описание машины из текстового файла
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,60 @@
|
||||||
|
#include "declaration.h"
|
||||||
|
|
||||||
|
void loadDescription(turing *t, char *nameFile) {
|
||||||
|
FILE *in;
|
||||||
|
in = fopen(nameFile, "r");
|
||||||
|
if (in == NULL) {
|
||||||
|
printf("The file '%s' was not opened", nameFile);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
bool testForS = false, testForBlank = false;
|
||||||
|
|
||||||
|
printf("States: ");
|
||||||
|
int N = 0;
|
||||||
|
char c;
|
||||||
|
t->states = malloc((N + 1) * sizeof(char));
|
||||||
|
fscanf(in, "%c", &c);
|
||||||
|
while (c != '\n') {
|
||||||
|
t->states[N] = c;
|
||||||
|
if (t->states[N] == 'S') {
|
||||||
|
testForS = true;
|
||||||
|
}
|
||||||
|
printf("%c ", t->states[N]);
|
||||||
|
fscanf(in, "%c", &c);
|
||||||
|
N++;
|
||||||
|
t->states = realloc(t->states, (N + 1) * sizeof(char));
|
||||||
|
}
|
||||||
|
t->statesNumb = N;
|
||||||
|
|
||||||
|
if (!testForS) {
|
||||||
|
printf("\nError in file '%s'", nameFile);
|
||||||
|
printf("\nThe set of states doesn't contain state STOP(S). Add S to it, please!");
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nAlphabet: ");
|
||||||
|
N = 0;
|
||||||
|
t->symbols = malloc((N + 1) * sizeof(char));
|
||||||
|
while (fscanf(in, "%c", &c) != EOF) {
|
||||||
|
t->symbols[N] = c;
|
||||||
|
if (t->symbols[N] == 'B') testForBlank = true;
|
||||||
|
printf("%c ", t->symbols[N]);
|
||||||
|
N++;
|
||||||
|
t->symbols = realloc(t->symbols, (N + 1) * sizeof(char));
|
||||||
|
}
|
||||||
|
t->symbolsNumb = N;
|
||||||
|
|
||||||
|
if (!testForBlank) {
|
||||||
|
printf("\nError in file '%s'", nameFile);
|
||||||
|
printf("\nThe alphabet doesn't contain symbol Blank(B). Add B to it, please!");
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
t->symbolsNumb++;
|
||||||
|
t->symbols[t->symbolsNumb - 1] = ' ';
|
||||||
|
printf("%c ", t->symbols[t->symbolsNumb - 1]);
|
||||||
|
|
||||||
|
fclose(in);
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
abcS
|
||||||
|
01B
|
|
@ -0,0 +1,22 @@
|
||||||
|
#include "declaration.h"
|
||||||
|
|
||||||
|
int stateIndex(turing *t, char state) {
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < t->statesNumb; i++) {
|
||||||
|
if (t->states[i] == state) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int symbolIndex(turing *t, char symbol) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < t->symbolsNumb; i++) {
|
||||||
|
if (t->symbols[i] == symbol) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
a
|
||||||
|
10011
|
|
@ -0,0 +1,125 @@
|
||||||
|
#include "declaration.h"
|
||||||
|
|
||||||
|
void loadTape(turing *t, char *nameFile) {
|
||||||
|
FILE *in;
|
||||||
|
in = fopen(nameFile, "r");
|
||||||
|
if (in == NULL) {
|
||||||
|
printf("The file '%s' was not opened", nameFile);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
char state, linefeed;
|
||||||
|
fscanf(in, "%c", &state);
|
||||||
|
t->state = stateIndex(t, state);
|
||||||
|
printf("\nInitial state: %c\n", state);
|
||||||
|
if (t->state == -1) {
|
||||||
|
printf("Error in file '%s'\n", nameFile);
|
||||||
|
printf("Initial state %c isn't contained in the set of states of your Turing machine", state);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fscanf(in, "%c", &linefeed);
|
||||||
|
if (linefeed != '\n') {
|
||||||
|
printf("Error in file '%s'. There may only be linefeed after initial state\n", nameFile);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
t->tape = NULL;
|
||||||
|
char x;
|
||||||
|
fscanf(in, "%c ", &x);
|
||||||
|
printf("Initial tape: %c", x);
|
||||||
|
if (symbolIndex(t, x) == -1) {
|
||||||
|
printf("Error in '%s' file. Symbol %c isn't contained in the alphabet of your Turing machine", nameFile, x);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (t->tape == NULL) {
|
||||||
|
t->tape = malloc(sizeof(tapeT));
|
||||||
|
t->tape->symbol = symbolIndex(t, x);
|
||||||
|
t->tape->right = NULL;
|
||||||
|
t->tape->left = NULL;
|
||||||
|
}
|
||||||
|
tapeT *temp_tape;
|
||||||
|
temp_tape = t->tape;
|
||||||
|
while (!feof(in)) {
|
||||||
|
fscanf(in, "%c ", &x);
|
||||||
|
printf("%c", x);
|
||||||
|
if (symbolIndex(t, x) == -1) {
|
||||||
|
printf("Error in '%s' file. Symbol %c isn't contained in the alphabet of your Turing machine", nameFile, x);
|
||||||
|
fclose(in);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (temp_tape->right == NULL) {
|
||||||
|
tapeT *tmp_tp = temp_tape;
|
||||||
|
temp_tape->right = malloc(sizeof(tapeT));
|
||||||
|
if (temp_tape->right == NULL) {
|
||||||
|
printf("Not enough memory for tape \n");
|
||||||
|
exit(103);
|
||||||
|
}
|
||||||
|
temp_tape = temp_tape->right;
|
||||||
|
temp_tape->symbol = symbolIndex(t, x);
|
||||||
|
temp_tape->right = NULL;
|
||||||
|
temp_tape->left = tmp_tp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
fclose(in);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *args[]) {
|
||||||
|
if (argc != 5) {
|
||||||
|
printf("Error: input.txt description.txt command.txt output.txt \n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bool ifLoadTape = false;
|
||||||
|
int menuNumb = 0, lastNumb = 4;
|
||||||
|
turing *t = malloc(sizeof(turing));
|
||||||
|
loadDescription(t, args[2]);
|
||||||
|
loadCommand(t, args[3]);
|
||||||
|
while (menuNumb != 4) {
|
||||||
|
menuNumb = menu(lastNumb);
|
||||||
|
switch (menuNumb) {
|
||||||
|
case 1:
|
||||||
|
loadTape(t, args[1]);
|
||||||
|
ifLoadTape = true;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (ifLoadTape == false) {
|
||||||
|
printf("Initial tape wasn't loaded. Load tape, please!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
run(t, false, args[4]);
|
||||||
|
ifLoadTape = false;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (ifLoadTape == false) {
|
||||||
|
printf("Initial tape wasn't loaded. Load tape, please!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
run(t, true, args[4]);
|
||||||
|
ifLoadTape = false;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t->commands != NULL)
|
||||||
|
free(t->commands);
|
||||||
|
if (ifLoadTape) {
|
||||||
|
while (t->tape->left) {
|
||||||
|
tapeT *tmp;
|
||||||
|
tmp = t->tape;
|
||||||
|
t->tape = t->tape->left;
|
||||||
|
free(tmp);
|
||||||
|
}
|
||||||
|
t->tape = t->tape->left;
|
||||||
|
free(t->tape);
|
||||||
|
}
|
||||||
|
if (t != NULL)
|
||||||
|
free(t);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
#include "declaration.h"
|
||||||
|
|
||||||
|
int menu(int lastNumb) {
|
||||||
|
int number, ret;
|
||||||
|
printf("Modes of the machine:\n"
|
||||||
|
"1. Load tape \n"
|
||||||
|
"2. Run\n"
|
||||||
|
"3. Run step\n"
|
||||||
|
"4. Exit\n");
|
||||||
|
while (1) {
|
||||||
|
printf("\nInput ordinal number of modes(1->%d)", lastNumb);
|
||||||
|
ret = scanf("%d", &number);;
|
||||||
|
if (ret == 1 && (number >= 1 && number <= lastNumb)) break;
|
||||||
|
fflush(stdin);
|
||||||
|
printf("Error. Number must be in the interval [1..%d]", lastNumb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return number;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
[1] 0 0 1 1
|
||||||
|
|
||||||
|
1. a 1 1 R a
|
||||||
|
1 [0] 0 1 1
|
||||||
|
|
||||||
|
2. a 0 0 R a
|
||||||
|
1 0 [0] 1 1
|
||||||
|
|
||||||
|
2. a 0 0 R a
|
||||||
|
1 0 0 [1] 1
|
||||||
|
|
||||||
|
1. a 1 1 R a
|
||||||
|
1 0 0 1 [1]
|
||||||
|
|
||||||
|
1. a 1 1 R a
|
||||||
|
1 0 0 1 1 [ ]
|
||||||
|
|
||||||
|
3. a B B L b
|
||||||
|
1 0 0 1 [1]
|
||||||
|
|
||||||
|
5. b 1 0 L b
|
||||||
|
1 0 0 [1] 0
|
||||||
|
|
||||||
|
5. b 1 0 L b
|
||||||
|
1 0 [0] 0 0
|
||||||
|
|
||||||
|
4. b 0 1 L c
|
||||||
|
1 [0] 1 0 0
|
||||||
|
|
||||||
|
7. c 0 0 L c
|
||||||
|
[1] 0 1 0 0
|
||||||
|
|
||||||
|
9. c 1 1 L c
|
||||||
|
[ ] 1 0 1 0 0
|
||||||
|
|
||||||
|
8. c B B R S
|
||||||
|
[1] 0 1 0 0
|
|
@ -0,0 +1,141 @@
|
||||||
|
#include "declaration.h"
|
||||||
|
|
||||||
|
command findCommand(turing *t, char stateCurrent, char symbolCurrent) {
|
||||||
|
// find by state
|
||||||
|
command *resTrans1 = malloc(t->symbolsNumb * sizeof(command));
|
||||||
|
command resTrans;
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 0; i < t->commandsNumb; i++) {
|
||||||
|
if (t->states[t->commands[i].state1] == stateCurrent) {
|
||||||
|
resTrans1[j] = t->commands[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// find by symbol
|
||||||
|
for (int i = 0; i < t->symbolsNumb - 1; i++) {
|
||||||
|
if (t->symbols[resTrans1[i].symbol1] == symbolCurrent) {
|
||||||
|
resTrans = resTrans1[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(resTrans1);
|
||||||
|
return resTrans;
|
||||||
|
}
|
||||||
|
|
||||||
|
void run(turing *t, bool step, char *nameFile) {
|
||||||
|
int key;
|
||||||
|
char stepCommand[5];
|
||||||
|
FILE *output;
|
||||||
|
output = fopen(nameFile, "w");
|
||||||
|
if (output == NULL) {
|
||||||
|
printf("The file '%s' was not opened\n", nameFile);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (step) printf("<Enter> - next step, stop - stop, run - run\n");
|
||||||
|
tapeT *tempTape = t->tape;
|
||||||
|
int idPrint = 0, i = 0;
|
||||||
|
command currentTrans;
|
||||||
|
while (1) {
|
||||||
|
if (i != 0) {
|
||||||
|
fprintf(output, "\n%d. %c %c %c %c %c\n", currentTrans.number, t->states[currentTrans.state1],
|
||||||
|
t->symbols[currentTrans.symbol1], t->symbols[currentTrans.symbol2], currentTrans.dir,
|
||||||
|
t->states[currentTrans.state2]);
|
||||||
|
printf("%d. %c %c %c %c %c", currentTrans.number, t->states[currentTrans.state1],
|
||||||
|
t->symbols[currentTrans.symbol1], t->symbols[currentTrans.symbol2], currentTrans.dir,
|
||||||
|
t->states[currentTrans.state2]);
|
||||||
|
printf("\nCurrent state: %c\n", t->states[currentTrans.state2]);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
tapeT *tape = t->tape;
|
||||||
|
while (tape->left != NULL) {
|
||||||
|
tape = tape->left;
|
||||||
|
}
|
||||||
|
int idPrint1 = 0;
|
||||||
|
while (tape->right != NULL) {
|
||||||
|
if (idPrint1 == idPrint) {
|
||||||
|
fprintf(output, "[%c]", t->symbols[tape->symbol]);
|
||||||
|
printf("[%c]", t->symbols[tape->symbol]);
|
||||||
|
idPrint1++;
|
||||||
|
} else {
|
||||||
|
fprintf(output, " %c ", t->symbols[tape->symbol]);
|
||||||
|
printf(" %c ", t->symbols[tape->symbol]);
|
||||||
|
idPrint1++;
|
||||||
|
}
|
||||||
|
tape = tape->right;
|
||||||
|
}
|
||||||
|
if (idPrint1 == idPrint) {
|
||||||
|
fprintf(output, " [%c] ", t->symbols[tape->symbol]);
|
||||||
|
printf(" [%c] ", t->symbols[tape->symbol]);
|
||||||
|
} else {
|
||||||
|
fprintf(output, " %c ", t->symbols[tape->symbol]);
|
||||||
|
printf(" %c ", t->symbols[tape->symbol]);
|
||||||
|
}
|
||||||
|
fprintf(output, "\n");
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
if (t->states[t->state] == 'S') {
|
||||||
|
fclose(output);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t->symbols[tempTape->symbol] == ' ') {
|
||||||
|
currentTrans = findCommand(t, t->states[t->state], 'B');
|
||||||
|
printf("1 \n");
|
||||||
|
} else {
|
||||||
|
currentTrans = findCommand(t, t->states[t->state], t->symbols[tempTape->symbol]);
|
||||||
|
}
|
||||||
|
if (t->symbols[currentTrans.symbol2] == 'B') {
|
||||||
|
tempTape->symbol = t->symbolsNumb - 1;
|
||||||
|
} else {
|
||||||
|
tempTape->symbol = currentTrans.symbol2;
|
||||||
|
}
|
||||||
|
if (currentTrans.dir == 'R') {
|
||||||
|
idPrint++;
|
||||||
|
if (tempTape->right == NULL) {
|
||||||
|
tempTape->right = malloc(sizeof(tapeT));
|
||||||
|
|
||||||
|
|
||||||
|
tapeT *tt = tempTape->right;
|
||||||
|
tt->left = tempTape;
|
||||||
|
tt->right = NULL;
|
||||||
|
tt->symbol = t->symbolsNumb - 1;
|
||||||
|
}
|
||||||
|
tempTape = tempTape->right;
|
||||||
|
} else {
|
||||||
|
idPrint--;
|
||||||
|
if (tempTape->left == NULL) {
|
||||||
|
tempTape->left = malloc(sizeof(tapeT));
|
||||||
|
|
||||||
|
|
||||||
|
tapeT *tt = tempTape->left;
|
||||||
|
tt->right = tempTape;
|
||||||
|
tt->left = NULL;
|
||||||
|
tt->symbol = t->symbolsNumb - 1;
|
||||||
|
idPrint = 0;
|
||||||
|
}
|
||||||
|
tempTape = tempTape->left;
|
||||||
|
}
|
||||||
|
|
||||||
|
t->state = currentTrans.state2;
|
||||||
|
|
||||||
|
if (step) {
|
||||||
|
while (1) {
|
||||||
|
key = getc(stdin);
|
||||||
|
if (key == ENTER) break;
|
||||||
|
ungetc(key, stdin);
|
||||||
|
scanf(" %4s", stepCommand);
|
||||||
|
fflush(stdin);
|
||||||
|
if (!strcmp(stepCommand, "run")) {
|
||||||
|
step = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!strcmp(stepCommand, "stop")) {
|
||||||
|
fclose(output);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("error");
|
||||||
|
fflush(stdin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/env lua5.3
|
||||||
|
|
||||||
|
-- NOTE: Lua uses double-precision float and 64-bit integer
|
||||||
|
-- (except when being specifically compiled with single-precision float and 32-bit integer)
|
||||||
|
-- Double-precision floating-point number: exact integers up to 2^53
|
||||||
|
-- [1 bit](sign) + [11 bits](exponent) + [53 bits (52 explicitly stored)](fraction)
|
||||||
|
-- Single-precision floating-point number: exact integers up to 2^24
|
||||||
|
-- [1 bit](sign) + [8 bits](exponent) + [24 bits (23 explicitly stored)](fraction)
|
||||||
|
|
||||||
|
-- Integer wraps around
|
||||||
|
-- Below are max(min)imum presentable integers
|
||||||
|
print(math.maxinteger == 0x7fffffffffffffff) -- 2^63 - 1
|
||||||
|
print(math.mininteger == 0x8000000000000000)
|
||||||
|
|
||||||
|
-- Convert ineger to float (up to 2^53)
|
||||||
|
print(math.type(3 + 0.0))
|
||||||
|
-- Force a number to be integer (has no fractional part)
|
||||||
|
local function cond2int(x)
|
||||||
|
return math.tointeger(x) or x
|
||||||
|
end
|
||||||
|
print(math.type(3.0 | 0))
|
||||||
|
print(math.tointeger(356.00))
|
||||||
|
print(math.tointeger(5.6))
|
||||||
|
print(cond2int(5.6))
|
||||||
|
|
||||||
|
-- Hex numbers are auto-converted to dec
|
||||||
|
print(0xffa4)
|
||||||
|
|
||||||
|
-- NOTE: operators of floats/integers returns a float/integer
|
||||||
|
-- Exception: division always returns a float. Use `//` to get an integer division
|
||||||
|
print(3 / 2)
|
||||||
|
print(math.pi // 1.2)
|
||||||
|
|
||||||
|
-- Rounding decimal digits
|
||||||
|
local pi = math.pi
|
||||||
|
print(pi - pi % 0.0001)
|
||||||
|
|
||||||
|
-- Radian is used by default
|
||||||
|
print(math.sin(30))
|
||||||
|
print(math.deg(2 * math.pi))
|
||||||
|
|
||||||
|
-- Unbiased rounding number function (haft-integers are rounded to the nearest even integer)
|
||||||
|
-- Using simply math.floor(x + 0.5) will always round the number up (eg. 2.5 -> 3)
|
||||||
|
-- also 2^52 + 0.5 cannot be represent (2^52 -> 2^53 has fixed interval 1)
|
||||||
|
local function round(x)
|
||||||
|
local f = math.floor(x)
|
||||||
|
if x == f or (x % 2.0 == 0.5) then
|
||||||
|
return f
|
||||||
|
else
|
||||||
|
return math.floor(x + 0.5)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print(round(2.5))
|
||||||
|
print(round(3.5))
|
|
@ -0,0 +1,29 @@
|
||||||
|
-- Strings are immutable
|
||||||
|
-- 'modify' it by using another string
|
||||||
|
local a = 'one string'
|
||||||
|
local b = string.gsub('one string', 'one', 'another')
|
||||||
|
print(a)
|
||||||
|
print(b)
|
||||||
|
|
||||||
|
-- Length
|
||||||
|
print(#"Count the length")
|
||||||
|
|
||||||
|
-- C-like escape sequences
|
||||||
|
print("Backslash inside quotes: '\\'")
|
||||||
|
print('Backslash inside quotes: \'\\\'')
|
||||||
|
|
||||||
|
-- utf-8
|
||||||
|
print('\x42 is the letter B')
|
||||||
|
print('\u{3b1} is alpha')
|
||||||
|
|
||||||
|
-- Querk
|
||||||
|
print('Notice the ]] below?')
|
||||||
|
print [===[a[b[i]] = x]===]
|
||||||
|
--[====[ Wow comment too
|
||||||
|
Still inside the comment
|
||||||
|
]====] print('Normal text here')
|
||||||
|
|
||||||
|
-- \z skips all subsequent space characters
|
||||||
|
local data = '\x00\x01\x02\x03\x04\x05\x06\x07\z
|
||||||
|
\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
|
||||||
|
print(data)
|
|
@ -0,0 +1,62 @@
|
||||||
|
import socket
|
||||||
|
from utility import wait_for_acknowledge
|
||||||
|
|
||||||
|
# initiate connection
|
||||||
|
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
|
||||||
|
server_addr = (socket.gethostname(), 2019) # change here for sending to another machine in LAN
|
||||||
|
client.connect(server_addr)
|
||||||
|
print(f"Connected to server!")
|
||||||
|
|
||||||
|
client.settimeout(5) # limit each communication time to 5s
|
||||||
|
|
||||||
|
# listening to server command
|
||||||
|
print("Client is now waiting for server's command.")
|
||||||
|
cmd_from_server = wait_for_acknowledge(client, "Start sending image.")
|
||||||
|
|
||||||
|
# send an ACK
|
||||||
|
imgCount_from_server = 0
|
||||||
|
if cmd_from_server == "Start sending image.":
|
||||||
|
print("Command \"Start sending image.\" received.")
|
||||||
|
print("Sending ACK...")
|
||||||
|
client.sendall(bytes("ACK", "utf-8"))
|
||||||
|
try:
|
||||||
|
print("Client is now waiting for the number of images.")
|
||||||
|
imgCount_from_server = int(wait_for_acknowledge(client, str(3)))
|
||||||
|
|
||||||
|
except:
|
||||||
|
raise ValueError("Number of images received is buggy.")
|
||||||
|
|
||||||
|
if imgCount_from_server > 0:
|
||||||
|
print("Number of images to receive: ", imgCount_from_server)
|
||||||
|
print("Sending ACK...")
|
||||||
|
client.sendall(bytes("ACK", "utf-8"))
|
||||||
|
|
||||||
|
print(f"Client is now eceiving {imgCount_from_server} images.")
|
||||||
|
|
||||||
|
for i in range(imgCount_from_server):
|
||||||
|
index = i + 1
|
||||||
|
file = f"./imgfromserver{index}.jpg"
|
||||||
|
try: # check for existing file, will overwrite
|
||||||
|
f = open(file, "x")
|
||||||
|
f.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
f = open(file, "wb")
|
||||||
|
print(f"\tReceiving image {index}")
|
||||||
|
imgsize = int(wait_for_acknowledge(client, str(3)))
|
||||||
|
print(f"\tImage size of {imgsize}B received by Client")
|
||||||
|
print("Sending ACK...")
|
||||||
|
client.sendall(bytes("ACK", "utf-8"))
|
||||||
|
buff = client.recv(imgsize)
|
||||||
|
f.write(buff)
|
||||||
|
f.close()
|
||||||
|
print(f"File {file} received!")
|
||||||
|
print("Sending ACK...")
|
||||||
|
client.sendall(bytes("ACK", "utf-8"))
|
||||||
|
# a = wait_for_acknowledge(client,"This is done.")
|
||||||
|
|
||||||
|
print("All images received.")
|
||||||
|
print("Closing connection.")
|
||||||
|
client.close()
|
|
@ -0,0 +1,66 @@
|
||||||
|
import socket
|
||||||
|
from os import listdir
|
||||||
|
from re import findall
|
||||||
|
from utility import wait_for_acknowledge
|
||||||
|
|
||||||
|
"""Global Var"""
|
||||||
|
buff_size = 1024
|
||||||
|
fileList = [file for file in listdir() if findall(r'.jpg',file) != []] #include all .jpg photos in that directory
|
||||||
|
#fileList = ['jihyo.jpg','dami.jpg','uju.jpg'] #images to be sent over to client
|
||||||
|
|
||||||
|
#initiate connection
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
server_addr = (socket.gethostname(), 2019) #change here for sending to another machine in LAN
|
||||||
|
s.bind(server_addr)
|
||||||
|
s.listen(5)
|
||||||
|
|
||||||
|
client, address = s.accept()
|
||||||
|
print(f"Connection from {address} has been established!")
|
||||||
|
|
||||||
|
#Send message to client to notify about sending image
|
||||||
|
print("Server sending command: \"Start sending image.\"")
|
||||||
|
client.sendall(bytes("Start sending image." ,"utf-8"))
|
||||||
|
|
||||||
|
#wait for reply from client
|
||||||
|
print("Server is now waiting for acknowledge from client.")
|
||||||
|
ack_from_client = wait_for_acknowledge(client,"ACK")
|
||||||
|
if ack_from_client != "ACK":
|
||||||
|
raise ValueError('Client does not acknowledge command.')
|
||||||
|
|
||||||
|
#Send message to client to notify about sending image
|
||||||
|
imgCount = len(fileList)
|
||||||
|
print("Server sends the number of images to be transfered client.")
|
||||||
|
client.sendall(bytes(str(imgCount) ,"utf-8"))
|
||||||
|
|
||||||
|
#wait for reply from client
|
||||||
|
print("Server is now waiting for acknowledge from client.")
|
||||||
|
ack_from_client = wait_for_acknowledge(client,"ACK")
|
||||||
|
if ack_from_client != "ACK":
|
||||||
|
raise ValueError('Client does not acknowledge img count.')
|
||||||
|
|
||||||
|
|
||||||
|
print("Server will now send the images.",end='')
|
||||||
|
for file in fileList:
|
||||||
|
|
||||||
|
img = open(file, 'rb')
|
||||||
|
b_img = img.read()
|
||||||
|
imgsize = len(b_img)
|
||||||
|
client.sendall(bytes(str(imgsize) ,"utf-8"))
|
||||||
|
print(f"\t sending image {file} size of {imgsize}B.")
|
||||||
|
|
||||||
|
print("Server is now waiting for acknowledge from client.")
|
||||||
|
ack_from_client = wait_for_acknowledge(client,"ACK")
|
||||||
|
if ack_from_client != "ACK":
|
||||||
|
raise ValueError('Client does not acknowledge img size.')
|
||||||
|
client.sendall(b_img)
|
||||||
|
img.close()
|
||||||
|
print(f"Image {file} sent!")
|
||||||
|
|
||||||
|
print("Server is now waiting for acknowledge from client.")
|
||||||
|
ack_from_client = wait_for_acknowledge(client,"ACK")
|
||||||
|
if ack_from_client != "ACK":
|
||||||
|
raise ValueError('Client does not acknowledge image transfer completion.')
|
||||||
|
|
||||||
|
|
||||||
|
print("All images sent.\nClosing connection.")
|
||||||
|
client.close()
|
|
@ -0,0 +1,14 @@
|
||||||
|
def wait_for_acknowledge(client, response):
|
||||||
|
"""
|
||||||
|
Waiting for this response to be sent from the other party
|
||||||
|
"""
|
||||||
|
amount_received = 0
|
||||||
|
amount_expected = len(response)
|
||||||
|
|
||||||
|
msg = str()
|
||||||
|
while amount_received < amount_expected:
|
||||||
|
data = client.recv(16)
|
||||||
|
amount_received += len(data)
|
||||||
|
msg += data.decode("utf-8")
|
||||||
|
# print(msg)
|
||||||
|
return msg
|
Loading…
Reference in New Issue