annotate src/fueue.c @ 8065:591b1467ccdf

<int-e> le/rn paste/"Paste" is a short story by Henry James. Its contents has been cut into pieces and distributed over numerous tin boxes on the World Wide Web, little pearls of wisdom buried among ordinary pastes.
author HackBot
date Sun, 15 May 2016 13:14:57 +0000
parents bd08a41fcbe2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2138
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
1 #include <stdio.h>
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
2 #include <stdlib.h>
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
3 #include <string.h>
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
4 #define TRUE 1
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
5 #define FALSE 0
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
6
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
7 /*
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
8 * Fueue Interpreter in language C
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
9 * the esoteric programming language Fueue was designed in 2012 by Taneb.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
10 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
11 * The following program was written by Stephan Kunne on august 29 2012.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
12 * It is public domain; you are free to use it, copy it, distribute it,
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
13 * or do whatever you'd like with it.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
14 * Credit and feedback are always appreciated ; you can email me at
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
15 * firstname dot name at gmail dot com with all your questions or remarks.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
16 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
17 * Examples:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
18 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
19 * ./fueuec '72 101 108 108 111 44 32 119 111 114 108 100 33 10 H'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
20 * Hello, world!
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
21 *
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
22 * ./fueuec --print '):[):]'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
23 * ):[):]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
24 * :[):])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
25 * )[):][):]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
26 * [):]):
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
27 * ):[):]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
28 * (...and so on)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
29 */
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
30
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
31 enum Typet
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
32 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
33 NUM, FUN, BLOCK
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
34 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
35
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
36 typedef struct Queue Queue;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
37 struct Queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
38 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
39 int size;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
40 struct Token *top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
41 struct Token *bottom;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
42 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
43
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
44 union value
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
45 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
46 int num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
47 char fun;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
48 Queue block;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
49 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
50
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
51 struct Token
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
52 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
53 enum Typet what;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
54 union value val;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
55 struct Token *next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
56 };
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
57
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
58
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
59 int is_empty(const Queue *q); // bool
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
60 void initQueue(Queue *q); // make it an empty queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
61 void push(struct Token *x, Queue *q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
62 struct Token* copyToken(const struct Token *x);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
63 Queue copyQueue(const Queue *q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
64 void initToken(struct Token *x);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
65 void pushnum(int num, Queue* q); // create NUM token and pushes it
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
66 void pushfun(char f, Queue* q); // create FUN token and pushes it
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
67 void pushblock(Queue newq, Queue* q); // create BLOCK token and pushes it
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
68 void deletetop(Queue* q); // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
69 void deleteQueue(Queue *q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
70 void sendback(Queue* q); // suppose q not empty, pop then push
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
71 struct Token* pop(Queue* q); // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
72 void append(Queue *q, const Queue *r);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
73 int matchwhat(const Queue* q, const char s[]); // bool peek at first 2 "nn" "n" "." ".." "n." "b." "b"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
74 void processFueue(Queue* q, int printmode); // the recursive function that does everything
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
75 Queue strtoqueue(const char s[], int *k); // transforms a string program into a queue program
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
76 void print_queue(const Queue *q); // prints a queue program
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
77 void error_empty(const char s[]); // raised by functions that "suppose q not empty" when q is empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
78
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
79
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
80 void processFueue(Queue* q, int printmode)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
81 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
82 int time = 0; // catching input
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
83 int i = 0; // to be used for input
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
84 int a = 0, b = 0; // to be used for some FUN
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
85 struct Token* p = NULL; // even more FUN
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
86 Queue newq; // having FUN with BLOCKs (specifically '(')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
87 initQueue(&newq); // this is done at every iteration where newq is used, though
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
88
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
89 while (TRUE) // stops thanks to a return; when 'H' is met
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
90 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
91
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
92 if (printmode)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
93 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
94 print_queue(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
95 printf("\n");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
96 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
97
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
98 if (time == q->size) // if time == q->size then input char and push ascii/unicode value
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
99 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
100 fflush(stdout);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
101 i = getchar();
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
102 pushnum(i, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
103 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
104 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
105
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
106 if (q->top->what == NUM) // q not empty because of the time != q->size requirement
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
107 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
108 // print char with ascii/unicode value q->top->val.num
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
109 printf("%c", (char) q->top->val.num);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
110 fflush(stdout);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
111 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
112 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
113 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
114 else if (q->top->what == FUN)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
115 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
116 char op = q->top->val.fun;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
117 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
118 switch (op)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
119 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
120 case '+':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
121 case '*':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
122 case '/':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
123 if (matchwhat(q, "nn"))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
124 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
125 a = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
126 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
127 b = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
128 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
129 if (op == '+')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
130 { pushnum(a+b, q); }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
131 else if (op == '*')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
132 { pushnum(a*b, q); }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
133 else // op == '/'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
134 { pushnum(a/b, q); }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
135 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
136 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
137 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
138 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
139 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
140 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
141 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
142 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
143 case '-':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
144 case '%':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
145 if (matchwhat(q, "n"))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
146 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
147 a = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
148 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
149 pushnum( ((op == '-')?(-a):(!a)) , q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
150 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
151 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
152 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
153 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
154 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
155 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
156 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
157 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
158 case ':':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
159 if (!is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
160 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
161 push(copyToken(q->top), q); // push copy
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
162 sendback(q); // push original
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
163 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
164 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
165 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
166 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
167 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
168 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
169 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
170 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
171 case '~':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
172 if (matchwhat(q, "..")) // if q has at least two items
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
173 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
174 p = pop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
175 sendback(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
176 push(p, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
177 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
178 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
179 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
180 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
181 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
182 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
183 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
184 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
185 case '!':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
186 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
187 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
188 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
189 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
190 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
191 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
192 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
193 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
194 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
195 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
196 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
197 case '$':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
198 if (matchwhat(q, "n."))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
199 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
200 a = q->top->val.num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
201 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
202 for (; a > 0; a--)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
203 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
204 push(copyToken(q->top), q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
205 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
206
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
207 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
208
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
209 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
210 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
211 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
212 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
213 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
214 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
215 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
216 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
217 case '(':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
218 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
219 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
220 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
221 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
222 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
223 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
224 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
225 initQueue(&newq);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
226 push(pop(q), &newq);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
227 pushblock(newq, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
228 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
229 // newq is the queue inside the block
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
230 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
231 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
232 case '<':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
233 if (matchwhat(q, "b."))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
234 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
235 sendback(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
236 push(pop(q), &(q->bottom->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
237 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
238 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
239 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
240 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
241 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
242 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
243 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
244 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
245 case ')':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
246 if (matchwhat(q, "b"))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
247 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
248 append(q, &(q->top->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
249 initQueue(&(q->top->val.block)); // mandatory since
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
250 deletetop(q); // deletetop does destroy the block it contains
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
251 time = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
252 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
253 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
254 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
255 pushfun(op, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
256 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
257 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
258 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
259 case 'H':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
260 // don't forget to delete the remaining of the queue here, will you?
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
261 return;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
262 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
263 // raise an error
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
264 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
265 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
266 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
267 else // if q->top->what == BLOCK
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
268 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
269 sendback(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
270 time++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
271 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
272 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
273 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
274
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
275
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
276
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
277 int main(int argc, char *argv[])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
278 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
279 Queue q;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
280 initQueue(&q); // q is empty now
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
281 char s[10000] = "72 101 108 108 111 44 32 119 111 114 108 100 33 10 H";
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
282 int printmode = FALSE; // a debug mode that will print the fueue program at each step
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
283 int k = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
284
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
285 switch (argc)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
286 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
287 case 1:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
288 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
289 case 2:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
290 if (strcmp(argv[1], "--print") == 0)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
291 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
292 printmode = TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
293 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
294 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
295 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
296 strncpy(s, argv[1], 10000);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
297 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
298 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
299 case 3:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
300 strncpy(s, argv[2], 10000);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
301 printmode = (strcmp(argv[1], "--print") == 0);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
302 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
303 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
304 fprintf(stderr, "Error: %s received too many arguments. The Hello world program\n", argv[0]);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
305 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
306 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
307
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
308 q = strtoqueue(s, &k);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
309
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
310 processFueue(&q, printmode);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
311 return 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
312 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
313
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
314
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
315 Queue strtoqueue(const char s[], int *k) // takes a fueue program as a string, and gives a queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
316 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
317 // *k is loop counter
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
318 Queue q; // the queue to be returned
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
319 initQueue(&q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
320 int n = 0; // decimals (usually n * 10 + 0-9)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
321 int intmode = FALSE; // bool "we're reading a number right now"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
322
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
323 if (*k == -1)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
324 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
325 printf("FUEUE: UNMATCHED OPENING SQUARE BRACKET PROBABLY FORGOT A CLOSING SQUARE BRACKET\n");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
326 return q;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
327 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
328
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
329 while (s[*k] != '\0' && s[*k] != ']')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
330 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
331 if (intmode && (s[*k] > '9' || s[*k] < '0')) // if intmode ends
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
332 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
333 pushnum(n, &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
334 n = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
335 intmode = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
336 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
337
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
338 switch (s[*k])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
339 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
340 case '+':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
341 case '-':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
342 case '*':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
343 case '/':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
344 case '%':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
345 case ':':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
346 case '~':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
347 case '!':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
348 case '$':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
349 case '(':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
350 case '<':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
351 case ')':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
352 case 'H':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
353 pushfun(s[*k], &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
354 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
355 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
356 case '0':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
357 case '1':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
358 case '2':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
359 case '3':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
360 case '4':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
361 case '5':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
362 case '6':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
363 case '7':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
364 case '8':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
365 case '9':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
366 n = n * 10 + (int) (s[*k] - '0');
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
367 intmode = TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
368 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
369 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
370 case '\n':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
371 case '\t':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
372 case ' ': // whitespace
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
373 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
374 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
375 case '[':
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
376 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
377 pushblock(strtoqueue(s, k), &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
378 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
379 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
380 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
381 printf("FUEUE: UNKNOWN %c OP\n", s[*k]);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
382 (*k)++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
383 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
384 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
385 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
386 if (intmode)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
387 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
388 pushnum(n, &q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
389 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
390
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
391 if (s[*k] == '\0')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
392 *k = -1;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
393 return q;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
394 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
395
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
396 void print_queue(const Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
397 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
398 struct Token *ptmp = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
399 while (ptmp != NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
400 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
401 if (ptmp->what == NUM)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
402 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
403 printf(" %d", ptmp->val.num);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
404 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
405 else if (ptmp->what == FUN)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
406 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
407 printf("%c", ptmp->val.fun);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
408 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
409 else if (ptmp->what == BLOCK)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
410 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
411 printf("[");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
412 print_queue(&(ptmp->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
413 printf("]");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
414 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
415 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
416 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
417 printf("That's impossible...Neither num nor fun nor block...\n");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
418 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
419 ptmp = ptmp->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
420 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
421 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
422
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
423
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
424
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
425
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
426 int is_empty(const Queue *q) // bool
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
427 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
428 if (q->top == NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
429 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
430 if (q->bottom == NULL && q->size == 0)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
431 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
432 return TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
433 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
434 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
435 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
436 error_empty("is_empty");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
437 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
438 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
439 return FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
440 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
441
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
442 void initQueue(Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
443 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
444 q->size = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
445 q->top = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
446 q->bottom = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
447 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
448
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
449 void push(struct Token *x, Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
450 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
451 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
452 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
453 q->top = x;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
454 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
455 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
456 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
457 q->bottom->next = x;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
458 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
459 q->bottom = x;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
460 q->size++;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
461 x->next = NULL; // just in case
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
462 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
463
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
464 Queue copyQueue(const Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
465 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
466 Queue c;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
467 struct Token* ptmp = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
468 initQueue(&c);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
469
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
470 while (ptmp != NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
471 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
472 push(copyToken(ptmp), &c);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
473 ptmp = ptmp->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
474 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
475
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
476 return c;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
477 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
478
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
479 void initToken(struct Token *x)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
480 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
481 x->what = NUM;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
482 x->val.num = 0;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
483 x->val.fun = '\0';
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
484 initQueue(&(x->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
485 x->next = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
486 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
487
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
488 struct Token* copyToken(const struct Token *x)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
489 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
490 struct Token *c = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
491 c->what = x->what;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
492
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
493 switch (x->what)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
494 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
495 case NUM:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
496 case FUN:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
497 c->val = x->val;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
498 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
499 case BLOCK:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
500 c->val.block = copyQueue(&(x->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
501 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
502 default:
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
503 fprintf(stderr, "Error: found a %d in my soup\n", x->what);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
504 break;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
505 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
506
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
507 c->next = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
508 return c;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
509 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
510
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
511 void pushnum(int num, Queue* q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
512 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
513 struct Token *t = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
514 initToken(t);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
515 t->what = NUM;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
516 t->val.num = num;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
517
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
518 push(t, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
519 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
520
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
521 void pushfun(char f, Queue* q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
522 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
523 struct Token *t = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
524 initToken(t);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
525 t->what = FUN;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
526 t->val.fun = f;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
527 push(t, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
528 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
529
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
530 void pushblock(Queue newq, Queue* q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
531 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
532 struct Token *t = malloc(sizeof(struct Token));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
533 initToken(t);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
534 t->what = BLOCK;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
535 t->val.block = newq;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
536 push(t, q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
537 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
538
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
539 void deletetop(Queue* q) // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
540 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
541 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
542 error_empty("deletetop");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
543
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
544 struct Token *todelete = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
545
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
546 if (q->top->what == BLOCK) // has to free the Queue inside
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
547 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
548 deleteQueue(&(q->top->val.block));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
549 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
550
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
551 if (q->top->next == NULL)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
552 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
553 free(q->top);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
554 q->top = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
555 q->bottom = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
556 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
557 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
558 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
559 todelete = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
560 q->top = q->top->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
561 free(todelete);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
562 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
563 q->size--;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
564 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
565
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
566 void deleteQueue(Queue *q)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
567 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
568 while (!is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
569 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
570 deletetop(q);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
571 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
572 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
573
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
574 void sendback(Queue* q) // suppose q not empty, pop then push
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
575 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
576 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
577 error_empty("sendback");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
578
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
579 q->bottom->next = q->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
580 q->top = q->top->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
581 q->bottom = q->bottom->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
582 q->bottom->next = NULL;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
583 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
584
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
585 struct Token* pop(Queue* q) // suppose q not empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
586 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
587 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
588 error_empty("sendback");
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
589
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
590 struct Token* t = q->top; // note that t->next is equal to q->top->next now
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
591 q->top = q->top->next;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
592 q->size--;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
593
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
594 return t;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
595 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
596
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
597 void append(Queue *q, const Queue *r)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
598 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
599 if (is_empty(q))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
600 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
601 q->top = r->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
602 q->bottom = r->bottom;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
603 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
604 else if (!is_empty(r))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
605 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
606 q->bottom->next = r->top;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
607 q->bottom = r->bottom;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
608 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
609 q->size += r->size;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
610 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
611
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
612 int matchwhat(const Queue* q, const char s[]) // bool "nn" "n" "." ".." "n." "b." "b"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
613 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
614 int itsok = TRUE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
615 if ((s[0] != '\0') && !(is_empty(q))) // if neither s nor q is empty
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
616 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
617 if (s[0] == 'n' && q->top->what != NUM) // if top should be num
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
618 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
619 if (s[0] == 'b' && q->top->what != BLOCK) // if top should be block
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
620 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
621 if (s[1] != '\0' && q->top->next == NULL) // if should have second element
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
622 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
623 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
624 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
625 else // so it indeed has a second element, or it doesn't need to have one
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
626 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
627 if (s[1] == 'n' && q->top->next->what != NUM) // second should be num
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
628 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
629 if (s[1] == 'b' && q->top->next->what != BLOCK) // second should be block
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
630 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
631 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
632 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
633 else
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
634 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
635 if (s[0] != '\0') // if s is not empty but q is
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
636 itsok = FALSE;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
637 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
638
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
639 // printf("matchwhat: %s\n", (itsok?"TRUE":"FALSE"));
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
640 return itsok;
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
641 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
642
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
643 void error_empty(const char s[])
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
644 {
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
645 fprintf(stderr, "Error: queue was empty in %s\n", s);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
646 exit(EXIT_FAILURE);
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
647 }
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
648
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
649
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
650