-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsystem.c
More file actions
131 lines (115 loc) · 5.62 KB
/
system.c
File metadata and controls
131 lines (115 loc) · 5.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include "system.h"
#include "lex.yy.h"
#include "bison.tab.h"
#include "xestionErros.h"
#include "taboaSimbolos.h"
int varEcho = 1;
double clear() {
system("clear");
return 0;
}
double sair() {
printf(AMARILLO"Saíndo do programa..."RESET"\n\n");
finalizarTS();
yylex_destroy();
exit(EXIT_SUCCESS);
}
double axuda() {
printf("\n===================================================================================================================================================\n\n"
"\t\t\t\t\t\t\t\t\tAXUDA\n\n"
"---------------------------------------------------------------------------------------------------------------------------------------------------\n\n"
"\tSOBRE O INTÉRPRETE\n"
"\t\tCabe destacar que este intérprete está en fase beta, polo cal os erros de sintaxe non están xestionados de maneira óptima,\n"
"\t\tfacendo que o intérprete deteña a execución en caso de que estes ocorran. Por outro lado, a sintaxe e o léxico son os que\n"
"\t\tcabe esperar de calquera intérprete matemático.\n\n"
"\t\tO intérprete ten definidas dúas constantes: 'pi' e 'e'. As constantes non se poden modificar.\n\n"
"\t\tAs operacións permitidas por defecto son as seguintes: suma ('+'), resta ('-'), multiplicación ('*'), división ('/'),\n"
"\t\tmódulo ('%%') e potencia ('^'). De todos modos pódense engadir máis operacións mediante a importación de librerías. Por\n"
"\t\texemplo: para importar a librería matemática escríbese o comando 'importar libm.so.6', e para usar as súas funcións a\n"
"\t\tsintaxe será 'libm/FUNC'.\n\n"
"\t\tO intérprete admite como máximo funcións con dous parámetros, os cales irán entre paréntesis e separados por unha coma. Para\n"
"\t\tusar as funcións das librerías usarase de prefixo a parte do nome do ficheiro de antes da primeira extensión, así ao importar\n"
"\t\to ficheiro 'libx.so', as súas funcións serán accesibles a través de 'libx/FUNC'.\n\n\n"
"\tCOMANDOS\n"
"\t\tPara a execución de comandos hai dous tipos de sintaxe: con paréntesis ou sen eles. Nos comandos sen parámetros sería 'CMND'\n"
"\t\tou 'CMND()', respectivamente; e nos comandos cun parámetro sería 'CMND PARAM' ou 'CMND(PARAM)', respectivamente.\n\n"
"\t\tOs comandos dispoñibles son:\n\n"
"\t\t\t- axuda\t\t\t\tMostra esta axuda. Tamén se pode mostar ao iniciar o propio intérprete indicando a\n"
"\t\t\t\t\t\t\topción '-h': './nicalc -h'.\n\n"
"\t\t\t- cargar FICHEIRO\t\tCarga e executa un ficheiro.\n"
"\t\t\t\t\t\t\tEste ficheiro debe respectar a sintaxe do intérprete e non poderá cargar outros\n"
"\t\t\t\t\t\t\tficheiros desde el (en caso de que o faga non se asegura o correcto funcionamento\n"
"\t\t\t\t\t\t\tdo intérprete).\n"
"\t\t\t\t\t\t\tTamén se poden executar ficheiros ao iniciar o propio intérprete inidicándoo como\n"
"\t\t\t\t\t\t\targumento: './nicalc FICHEIRO'.\n\n"
"\t\t\t- clear\t\t\t\tLimpa a terminal de saída.\n\n"
"\t\t\t- echo\t\t\t\tActiva/Desactiva a impresión da información de saída. Por defecto está activada.\n\n"
"\t\t\t- importar LIBRERIA\t\tImporta unha librería de forma dinámica a través do seu ficheiro .so.\n"
"\t\t\t\t\t\t\tSe se indica só o nome, buscarase por orde nas rutas /lib e /usr/lib, non obstante\n"
"\t\t\t\t\t\t\tpódense importar librerías indicando a ruta completa do seu ficheiro .so.\n\n"
"\t\t\t- limparws\t\t\tLimpa o espazo de traballo.\n\n"
"\t\t\t- sair\t\t\t\tSae do intérprete.\n\n"
"\t\t\t- taboa\t\t\t\tMostra a táboa de símbolos, que contén os comandos, constantes, funcións usadas\n"
"\t\t\t\t\t\t\talgunha vez, librerías importadas e variables.\n\n"
"\t\t\t- ws\t\t\t\tMostrar o espazo de traballo actual, que contén as variables definidas ata o momento.\n\n"
"\n===================================================================================================================================================\n\n");
return 0;
}
double echo() {
if (varEcho == 1) {
varEcho = 0;
} else {
varEcho = 1;
}
cambiarEcho(varEcho);
return 0;
}
double taboa() {
imprimirTS();
return 0;
}
double ws() {
imprimirWS();
return 0;
}
double limparws() {
eliminarWS();
printf(AMARILLO"Espazo de traballo limpado correctamente.\n\n"RESET);
return 0;
}
double cargar(char *ficheiro) {
yyin = fopen(ficheiro, "r");
if (yyin == NULL) {
lanzarErro(FICHEIRO_NON_ATOPADO);
yyin = stdin;
} else {
executandoScript(1);
}
return 0;
}
double importar(char *libreria) {
void *lib = dlopen(libreria, RTLD_LAZY);
char *nome_lib = NULL, *lexema;
if (lib == NULL) {
printf(ROJO"Erro: apertura de librería fallida.\n\tDetalles: %s"RESET"\n\n", dlerror());
} else {
for (int i = ((int) (strlen(libreria) - 1)); i >= 0; i--) {
if (libreria[i] == '/') {
nome_lib = &libreria[i + 1];
break;
}
}
if (nome_lib == NULL) {
nome_lib = libreria;
}
lexema = strtok(nome_lib, ".");
CompLexico comp_lib = {LIB, lexema, .valor.libhandle=lib};
insertar(comp_lib);
printf(AMARILLO"Librería cargada correctamente.\n\n"RESET);
}
return 0;
}