-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtoken.c
68 lines (61 loc) · 1.62 KB
/
token.c
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
/**********************************
Algoritmos e Estrutura de Dados 1
Prof. Rafael Liberato
-----------------------------------
Exercício: Leitor de Token
Aluno: Rômulo Manciola Meloca
Data: 07/11/14
***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "Headers/token.h"
void setTokenString(TokenReader *reader, char* str) {
reader->length = strlen(str);
reader->pos = 0;
reader->str = (char*) calloc(reader->length, sizeof (char));
reader->str = str;
}
TokenReader* newTokenReader(char *str) {
TokenReader *tokenReader = (TokenReader*) malloc(sizeof (TokenReader));
setTokenString(tokenReader, str);
return tokenReader;
}
void freeTokenReader(TokenReader *reader) {
free(reader);
}
int hasMoreTokens(TokenReader *reader) {
while (reader->str[reader->pos] == ' ' || reader->str[reader->pos] == 9) {
reader->pos++;
}
return reader->pos < reader->length;
}
char* substring(char *str, int inicio, int fim) {
char* sub = (char*) calloc(fim - inicio, sizeof (char));
memcpy(sub, str + inicio, fim - inicio);
return sub;
}
char* nextToken(TokenReader *reader) {
if (!hasMoreTokens(reader)) {
return NULL;
}
int i = reader->pos;
char *token;
while (isalnum(reader->str[i]) || reader->str[i] == '_') {
i++;
}
if (reader->str[i] == '\'') {
i++;
while (reader->str[i] != '\'') {
i++;
}
i++;
}
if (i == reader->pos) {
i++;
}
token = substring(reader->str, reader->pos, i);
reader->pos = i;
return token;
}