1 
2 //metadoc Token copyright Steve Dekorte 2002
3 //metadoc Token license BSD revised
4 
5 #include "IoToken.h"
6 #include <stdlib.h>
7 #include <string.h>
8 #include <stdio.h>
9 
IoToken_new(void)10 IoToken *IoToken_new(void)
11 {
12 	IoToken *self = (IoToken *)io_calloc(1, sizeof(IoToken));
13 	self->name = NULL;
14 	self->charNumber = -1;
15 
16 	return self;
17 }
18 
IoToken_free(IoToken * self)19 void IoToken_free(IoToken *self)
20 {
21 	if (self->name) io_free(self->name);
22 	if (self->error) io_free(self->error);
23 	io_free(self);
24 }
25 
IoToken_typeName(IoToken * self)26 const char *IoToken_typeName(IoToken *self)
27 {
28 	switch (self->type)
29 	{
30 		case NO_TOKEN:         return "NoToken";
31 		case OPENPAREN_TOKEN:  return "OpenParen";
32 		case COMMA_TOKEN:      return "Comma";
33 		case CLOSEPAREN_TOKEN: return "CloseParen";
34 		case MONOQUOTE_TOKEN:  return "MonoQuote";
35 		case TRIQUOTE_TOKEN:   return "TriQuote";
36 		case IDENTIFIER_TOKEN: return "Identifier";
37 		case TERMINATOR_TOKEN: return "Terminator";
38 		case COMMENT_TOKEN:    return "Comment";
39 		case NUMBER_TOKEN:     return "Number";
40 		case HEXNUMBER_TOKEN:  return "HexNumber";
41 	}
42 	return "UNKNOWN_TOKEN";
43 }
44 
IoToken_name_length_(IoToken * self,const char * name,size_t len)45 void IoToken_name_length_(IoToken *self, const char *name, size_t len)
46 {
47 	self->name = strncpy(io_realloc(self->name, len + 1), name, len);
48 	self->name[len] = (char)0;
49 	self->length = len;
50 }
51 
IoToken_name_(IoToken * self,const char * name)52 void IoToken_name_(IoToken *self, const char *name)
53 {
54 	self->name = strcpy((char *)io_realloc(self->name, strlen(name) + 1), name);
55 	self->length = strlen(name);
56 }
57 
IoToken_name(IoToken * self)58 char *IoToken_name(IoToken *self)
59 {
60 	return self->name ? self->name : (char *)"";
61 }
62 
IoToken_error_(IoToken * self,const char * error)63 void IoToken_error_(IoToken *self, const char *error)
64 {
65 	self->error = strcpy((char *)io_realloc(self->error, strlen(error) + 1), error);
66 }
67 
IoToken_error(IoToken * self)68 char *IoToken_error(IoToken *self)
69 {
70 	return self->error ? self->error : (char *)"";
71 }
72 
IoToken_nameIs_(IoToken * self,const char * name)73 int IoToken_nameIs_(IoToken *self, const char *name)
74 {
75 	if (strlen(self->name) == 0 && strlen(name) != 0)
76 	{
77 		return 0;
78 	}
79 	//return !strncmp(self->name, name, self->length);
80 	return !strcmp(self->name, name);
81 }
82 
IoToken_type(IoToken * self)83 IoTokenType IoToken_type(IoToken *self)
84 {
85 	return self->type;
86 }
87 
IoToken_lineNumber(IoToken * self)88 int IoToken_lineNumber(IoToken *self)
89 {
90 	return self->lineNumber;
91 }
92 
IoToken_charNumber(IoToken * self)93 int IoToken_charNumber(IoToken *self)
94 {
95 	return self->charNumber;
96 }
97 
IoToken_quoteName_(IoToken * self,const char * name)98 void IoToken_quoteName_(IoToken *self, const char *name)
99 {
100 	char *old = self->name;
101 	size_t length = strlen(name) + 3;
102 	self->name = io_calloc(1, length);
103 	snprintf(self->name, length, "\"%s\"", name);
104 
105 	if (old)
106 	{
107 		io_free(old);
108 	}
109 }
110 
IoToken_type_(IoToken * self,IoTokenType type)111 void IoToken_type_(IoToken *self, IoTokenType type)
112 {
113 	self->type = type;
114 }
115 
IoToken_nextToken_(IoToken * self,IoToken * nextToken)116 void IoToken_nextToken_(IoToken *self, IoToken *nextToken)
117 {
118 	if (self == nextToken)
119 	{
120 		printf("next == self!\n");
121 		exit(1);
122 	}
123 
124 	if (self->nextToken)
125 	{
126 		IoToken_free(self->nextToken);
127 	}
128 
129 	self->nextToken = nextToken;
130 }
131 
IoToken_print(IoToken * self)132 void IoToken_print(IoToken *self)
133 {
134 	IoToken_printSelf(self);
135 }
136 
IoToken_printSelf(IoToken * self)137 void IoToken_printSelf(IoToken *self)
138 {
139 	size_t i;
140 	printf("'");
141 
142 	for (i = 0; i < self->length; i ++)
143 	{
144 		putchar(self->name[i]);
145 	}
146 
147 	printf("' ");
148 }
149 
IoTokenType_isValidMessageName(IoTokenType self)150 int IoTokenType_isValidMessageName(IoTokenType self)
151 {
152 	switch (self)
153 	{
154 		case IDENTIFIER_TOKEN:
155 		case MONOQUOTE_TOKEN:
156 		case TRIQUOTE_TOKEN:
157 		case NUMBER_TOKEN:
158 		case HEXNUMBER_TOKEN:
159 			return 1;
160 		default:
161 			return 0;
162 	}
163 	return 0;
164 }
165 
166