-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.h
182 lines (164 loc) · 4.56 KB
/
parser.h
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#ifndef PARSER_H
#define PARSER_H
#include <stdbool.h> /* bool */
#include <stdio.h> /* FILE */
#include "command.h" /* pipeline */
/* Tipo opaco, implementación oculta */
typedef struct parser_s * Parser;
typedef enum {
ARG_NORMAL, // Indicates a command name or command argument type
ARG_INPUT, // Indicates an input redirection
ARG_OUTPUT // Indicates an output redirection
} arg_kind_t; // An auxiliary type for parser_next_argument()
Parser parser_new(FILE *input);
/*
* Constructor de Parser.
* El input es el archivo de donde se quieren parsear pipelines.
* REQUIRES:
* input != NULL
* ENSURES:
* Devuelve un Parser para el archivo
* o NULL en caso de haber un error de inicialización
*/
Parser parser_destroy(Parser parser);
/*
* Destructor de Parser.
* REQUIRES:
* parser != NULL
* ENSURES:
* Devuelve NULL
*/
char * parser_next_argument(Parser parser, arg_kind_t *arg_type);
/*
* Procesa el próximo argumento e indica si corresponde a un argumento normal, o
* si es una redirección de entrada/salida. Si se encuentra un símbolo del
* operador pipe (|) o un fin de línea (\n), el procesamiento no avanza, dejando
* sin consumir dichos símbolos.
*
* ls -l -a > salida.txt < entrada.txt | wc -l & \n
*
* cat /proc/cpuinfo | grep model
*
* Salida 1: "ls", ARG_NORMAL
* Salida 2: "-l", ARG_NORMAL
* Salida 3: "-a", ARG_NORMAL
* Salida 4: "salida.txt", ARG_OUTPUT
* Salida 5: "entrada.txt", ARG_INPUT
*
* aa algo.txt && bb lala.txt &
*_
* EJEMPLO:
*
* arg_kind_t type;
* char *arg;
* arg = parser_next_argument(parser, &type);
* if (type == ARG_NORMAL) {
* }
*
* - En `type` se guarda el tipo de argumento:
* + ARG_NORMAL: Era el nombre de un comando o uno de sus argumentos
* + ARG_INPUT: Era una redirección de entrada (algo como "< nombre_archivo")
* + ARG_OUTPUT: Era una redirección de salida (algo como "> nombre_archivo")
*
* - En `arg` se guarda la cadena procesada. En caso de que el tipo del
* argumento se corresponda a ARG_INPUT o ARG_OUTPUT solo se guarda
* "nombre_archivo" sin los símbolos "<", ">".
*
* El valor devuelto por la función es un puntero a memoria dinámica que queda
* a cargo del llamador
*
* REQUIRES:
* ! parser_at_eof (parser)
* ENSURES:
*
*/
void parser_op_background(Parser parser, bool *was_op_background);
/*
* Intenta leer un operador de background "&" e indica si se encontró dicho
* operador. En caso de encontrar un "&", el operador se consume en caso
* contrario no se consume ningún símbolo de la entrada.
*
* EJEMPLO:
*
* bool is_background;
* parser_op_background(parser, &is_background);
*
* - En `is_background` se indica si se econtró el operador
*
* REQUIRES:
* ! parser_at_eof (parser)
* ENSURES:
*
*/
void parser_skip_blanks(Parser parser);
/*
* Consume todos los caracteres en blanco a continuación que hay en la entrada.
* Detiene el procesamiento ante cualquier símbolo que no es un espacio (" ") o
* un tabulador ("\t").
*
* EJEMPLO:
*
* parser_skip_blanks(parser);
*
* REQUIRES:
* ! parser_at_eof (parser)
* ENSURES:
*
*/
void parser_op_pipe(Parser parser, bool *was_op_pipe);
/*
* Intenta leer un operador de pipe "|" e indica si se encontró dicho
* operador. En caso de encontrar un "|", el operador se consume en caso
* contrario no se consume ningún símbolo de la entrada.
*
* EJEMPLO:
*
* bool is_pipe;
* parser_op_pipe(parser, &is_pipe);
*
* - En `is_pipe` se indica si se econtró el operador
*
* REQUIRES:
* ! parser_at_eof (parser)
* ENSURES:
*
*/
void parser_garbage(Parser parser, bool *garbage);
/*
* Consume todos los caracteres encontrados hasta un final de linea "\n" el
* cual también se consume. Indica si se encontraron símbolos distintos de
* espacios en blanco en el medio del procesamiento.
*
*
* NOTA: Es la única función del TAD que consume un "\n"
*
*
* EJEMPLO:
*
* bool garbage;
* parser_garbage(parser, &garbage);
*
* - En `garbage` se indica si se econtraron caracteres distintos de espacios
* en blanco
*
* REQUIRES:
* ! parser_at_eof (parser) && garbage != NULL
*
*/
char * parser_last_garbage(Parser parser);
/*
* Devuelve una cadena con los símbolos leídos en la última llamada a
* `parser_garbage()` en donde se haya encontrado basura. La cadena devuelta es
* propiedad del TAD y NO DEBE SER LIBERADA.
*
* REQUIRES:
* ! parser_at_eof (parser)
*
*/
bool parser_at_eof(Parser parser);
/*
* Consulta si el parser llegó al final del archivo.
* REQUIRES:
* parser != NULL
*/
#endif /* PARSER_H */