wasapi: Patched to compile on C89 systems, and use SDL_ceilf instead of ceilf.
1 /* See COPYING.txt for the full license governing this code. */
3 * \file action_configparser.c
5 * Source file for the parser for action config files.
8 #include <SDL_stdinc.h>
11 #include "SDL_visualtest_action_configparser.h"
12 #include "SDL_visualtest_rwhelper.h"
13 #include "SDL_visualtest_parsehelper.h"
16 FreeAction(SDLVisualTest_Action* action)
22 case SDL_ACTION_LAUNCH:
27 path = action->extra.process.path;
28 args = action->extra.process.args;
35 action->extra.process.path = NULL;
36 action->extra.process.args = NULL;
43 SDLVisualTest_EnqueueAction(SDLVisualTest_ActionQueue* queue,
44 SDLVisualTest_Action action)
46 SDLVisualTest_ActionNode* node;
49 SDLTest_LogError("queue argument cannot be NULL");
53 node = (SDLVisualTest_ActionNode*)SDL_malloc(
54 sizeof(SDLVisualTest_ActionNode));
57 SDLTest_LogError("malloc() failed");
60 node->action = action;
64 queue->rear = queue->front = node;
67 queue->rear->next = node;
74 SDLVisualTest_DequeueAction(SDLVisualTest_ActionQueue* queue)
76 SDLVisualTest_ActionNode* node;
79 SDLTest_LogError("queue argument cannot be NULL");
82 if(SDLVisualTest_IsActionQueueEmpty(queue))
84 SDLTest_LogError("cannot dequeue from empty queue");
87 if(queue->front == queue->rear)
89 FreeAction(&queue->front->action);
90 SDL_free(queue->front);
91 queue->front = queue->rear = NULL;
96 queue->front = queue->front->next;
97 FreeAction(&node->action);
105 SDLVisualTest_InitActionQueue(SDLVisualTest_ActionQueue* queue)
109 SDLTest_LogError("queue argument cannot be NULL");
117 SDLVisualTest_Action*
118 SDLVisualTest_GetQueueFront(SDLVisualTest_ActionQueue* queue)
122 SDLTest_LogError("queue argument cannot be NULL");
127 SDLTest_LogError("cannot get front of empty queue");
131 return &queue->front->action;
135 SDLVisualTest_IsActionQueueEmpty(SDLVisualTest_ActionQueue* queue)
139 SDLTest_LogError("queue argument cannot be NULL");
149 SDLVisualTest_EmptyActionQueue(SDLVisualTest_ActionQueue* queue)
153 while(!SDLVisualTest_IsActionQueueEmpty(queue))
154 SDLVisualTest_DequeueAction(queue);
158 /* Since the size of the queue is not likely to be larger than 100 elements
159 we can get away with using insertion sort. */
161 SortQueue(SDLVisualTest_ActionQueue* queue)
163 SDLVisualTest_ActionNode* head;
164 SDLVisualTest_ActionNode* tail;
166 if(!queue || SDLVisualTest_IsActionQueueEmpty(queue))
170 for(tail = head; tail && tail->next;)
172 SDLVisualTest_ActionNode* pos;
173 SDLVisualTest_ActionNode* element = tail->next;
175 if(element->action.time < head->action.time)
177 tail->next = tail->next->next;
178 element->next = head;
181 else if(element->action.time >= tail->action.time)
188 (pos->next->action.time < element->action.time);
190 tail->next = tail->next->next;
191 element->next = pos->next;
201 SDLVisualTest_InsertIntoActionQueue(SDLVisualTest_ActionQueue* queue,
202 SDLVisualTest_Action action)
204 SDLVisualTest_ActionNode* n;
205 SDLVisualTest_ActionNode* prev;
206 SDLVisualTest_ActionNode* newnode;
209 SDLTest_LogError("queue argument cannot be NULL");
213 if(SDLVisualTest_IsActionQueueEmpty(queue))
215 if(!SDLVisualTest_EnqueueAction(queue, action))
217 SDLTest_LogError("SDLVisualTest_EnqueueAction() failed");
223 newnode = (SDLVisualTest_ActionNode*)malloc(sizeof(SDLVisualTest_ActionNode));
226 SDLTest_LogError("malloc() failed");
229 newnode->action = action;
232 for(n = queue->front, prev = NULL; n; n = n->next)
234 if(action.time < n->action.time)
238 prev->next = newnode;
243 newnode->next = queue->front;
244 queue->front = newnode;
251 queue->rear->next = newnode;
252 newnode->next = NULL;
253 queue->rear = newnode;
259 SDLVisualTest_ParseActionConfig(char* file, SDLVisualTest_ActionQueue* queue)
261 char line[MAX_ACTION_LINE_LENGTH];
262 SDLVisualTest_RWHelperBuffer buffer;
269 SDLTest_LogError("file argument cannot be NULL");
274 SDLTest_LogError("queue argument cannot be NULL");
278 rw = SDL_RWFromFile(file, "r");
281 SDLTest_LogError("SDL_RWFromFile() failed");
285 SDLVisualTest_RWHelperResetBuffer(&buffer);
286 SDLVisualTest_InitActionQueue(queue);
288 while(SDLVisualTest_RWHelperReadLine(rw, line, MAX_ACTION_LINE_LENGTH,
291 SDLVisualTest_Action action;
295 token_ptr = strtok(line, " ");
297 (SDL_sscanf(token_ptr, "%d:%d:%d", &hr, &min, &sec) != 3))
299 SDLTest_LogError("Could not parse time token at line: %d",
301 SDLVisualTest_EmptyActionQueue(queue);
305 action.time = (((hr * 60 + min) * 60) + sec) * 1000;
308 token_ptr = strtok(NULL, " ");
309 if(SDL_strcasecmp(token_ptr, "launch") == 0)
310 action.type = SDL_ACTION_LAUNCH;
311 else if(SDL_strcasecmp(token_ptr, "kill") == 0)
312 action.type = SDL_ACTION_KILL;
313 else if(SDL_strcasecmp(token_ptr, "quit") == 0)
314 action.type = SDL_ACTION_QUIT;
315 else if(SDL_strcasecmp(token_ptr, "screenshot") == 0)
316 action.type = SDL_ACTION_SCREENSHOT;
317 else if(SDL_strcasecmp(token_ptr, "verify") == 0)
318 action.type = SDL_ACTION_VERIFY;
321 SDLTest_LogError("Could not parse type token at line: %d",
323 SDLVisualTest_EmptyActionQueue(queue);
328 /* parse the extra field */
329 if(action.type == SDL_ACTION_LAUNCH)
334 token_ptr = strtok(NULL, " ");
335 len = token_ptr ? SDL_strlen(token_ptr) : 0;
338 SDLTest_LogError("Please specify the process to launch at line: %d",
340 SDLVisualTest_EmptyActionQueue(queue);
344 path = (char*)SDL_malloc(sizeof(char) * (len + 1));
347 SDLTest_LogError("malloc() failed");
348 SDLVisualTest_EmptyActionQueue(queue);
352 SDL_strlcpy(path, token_ptr, len + 1);
354 token_ptr = strtok(NULL, "");
355 len = token_ptr ? SDL_strlen(token_ptr) : 0;
358 args = (char*)SDL_malloc(sizeof(char) * (len + 1));
361 SDLTest_LogError("malloc() failed");
363 SDLVisualTest_EmptyActionQueue(queue);
367 SDL_strlcpy(args, token_ptr, len + 1);
372 action.extra.process.path = path;
373 action.extra.process.args = args;
376 /* add the action to the queue */
377 if(!SDLVisualTest_EnqueueAction(queue, action))
379 SDLTest_LogError("SDLVisualTest_EnqueueAction() failed");
380 if(action.type == SDL_ACTION_LAUNCH)
382 SDL_free(action.extra.process.path);
383 if(action.extra.process.args)
384 SDL_free(action.extra.process.args);
386 SDLVisualTest_EmptyActionQueue(queue);
391 /* sort the queue of actions */