Added I/O operations (IN and OUT commands)

This commit is contained in:
Dmitriy Shishkov 2021-04-16 23:02:01 +05:00
parent d7c038066c
commit 12f904ef7a
No known key found for this signature in database
GPG Key ID: 7CAE12ED13853CAC
8 changed files with 77 additions and 4 deletions

View File

@ -7,6 +7,7 @@ Stack based virtual machine and assembly code compiler
- Assembly
- Stack operations (push & pop)
- Arithmetics operations
- I/O operations
## Assembly documentation
@ -28,6 +29,10 @@ Stack based virtual machine and assembly code compiler
Removes two top values in stack and pushes integer part of division
- **MOD**
Removes two top values in stack and pushes modulo
- **IN**
Inputs string with C I/O operators
- **OUT**
Outputs string with C I/O operators
## TODO

View File

@ -8,4 +8,8 @@ cmd_desc_t cmd_desc[] = {
{MUL, 0, "MUL"},
{DIV, 0, "DIV"},
{MOD, 0, "MOD"},
#ifdef IO_OPERATIONS
{IN, 0, "IN"},
{OUT, 0, "OUT"},
#endif
{NONE, 0, "NONE"}}

View File

@ -10,6 +10,10 @@ enum command_e
MUL,
DIV,
MOD,
#ifdef IO_OPERATIONS
IN,
OUT,
#endif
NONE
};

39
run.c
View File

@ -123,8 +123,45 @@ int exec(command_t cmd, stack_t *stack)
return *res;
}
break;
#ifdef IO_OPERATIONS
/**
* Inputs string with C I/O operators
*/
case IN:
{
char input[512];
scanf("%s", &input);
int size = str_len(input);
for (int pos = size; size >= 0; size--)
{
stack_push(stack, input[pos], res);
if (res != NULL)
return *res;
}
}
break;
/**
* Outputs string with C I/O operators
*/
case OUT:
{
char ch = stack_pop(stack, res);
if (res != NULL)
return *res;
while (ch != NULL)
{
putchar(ch);
ch = stack_pop(stack, res);
if (res != NULL)
return *res;
}
}
break;
#endif
default:
return -1;
return 1;
}
return 0;

5
run.h
View File

@ -3,6 +3,11 @@
#include "./stack.h"
#include "./command.h"
#include "./utils.h"
#ifdef IO_OPERATIONS
#include <stdio.h>
#endif
int run(command_t **buff, stack_t *stack);
int exec(command_t cmd, stack_t *stack);

View File

@ -30,12 +30,12 @@ int stack_push(stack_t *stack, int value, int *result)
if (stack->cursor > stack->size - 1)
{
*result = 1;
*result = 2;
return *result;
}
stack->mem[stack->cursor + 1] = value;
stack->cursor += 1;
stack->cursor++;
return 0;
}
@ -51,7 +51,7 @@ int stack_pop(stack_t *stack, int *result)
}
int value = stack->mem[stack->cursor];
stack->cursor -= 1;
stack->cursor--;
return value;
}

11
utils.c Normal file
View File

@ -0,0 +1,11 @@
#include "./utils.h"
int str_len(char str[])
{
int pos = 0;
while (str[pos] != NULL)
pos++;
return pos;
}

7
utils.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef UTILS_H
#include <stdlib.h>
int str_len(char str[]);
#endif