#include <stdio.h> #include <ctype.h> #include "stringops.h" #include "resp.h" static char io[1024]; int resp_add (resp_list *rl, char *l) { resp *ret; #ifdef FUNCTIONS puts ("**resp_add"); #endif ret = allocate (resp); while (isspace (*l)) l++; /******* lower bound *******/ if (*l == '*') { ret->lowerflag = 0; ret->lower = 0; } else if (isdigit (*l) || (*l == '-') || (*l == '+')) { ret->lowerflag = 1; ret->lower = atoi(l); } else { free (ret); return 0; } while ((*l != '\0') && (*l != 'o')) l++; if (*l == '\0') { free (ret); return 0; } else l++; while (isspace (*l)) l++; /******* upper bound *******/ if (*l == '*') { ret->upperflag = 0; ret->upper = 0; } else if (isdigit (*l) || (*l == '-') || (*l == '+')) { ret->upperflag = 1; ret->upper = atoi(l); } else { free (ret); return 0; } while ((*l != '\0') && (*l != ':')) l++; if (*l == '\0') { free (ret); return 0; } else l++; while (isspace (*l)) l++; /******* status change *******/ if (isdigit (*l) || (*l == '-') || (*l == '+')) { ret->status_change = atoi(l); } else { free (ret); return 0; } while ((*l != '\0') && (*l != ':')) l++; if (*l == '\0') { free (ret); return 0; } else l++; while (isspace (*l)) l++; /******* priority *******/ if (isdigit (*l) || (*l == '+')) ret->priority = atoi(l); else { free (ret); return 0; } while ((*l != '\0') && (*l != ':')) l++; if (*l == '\0') { free (ret); return 0; } else l++; while (isspace (*l)) l++; /******* response string *******/ copystring (ret->response, l); if (rl->tail != NULL) rl->tail->next = ret; else rl->head = ret; rl->tail = ret; (rl->size)++; (rl->priority_total) += ret->priority; return 1; } static void resp_elements_burn (resp *r) { #ifdef FUNCTIONS puts ("**resp_elements_burn"); #endif if (r) { resp_elements_burn(r->next); free (r->response); free (r); } } void resp_burn (resp_list *r) { #ifdef FUNCTIONS puts ("**resp_burn"); #endif if (r != NULL) { resp_elements_burn (r->head); free (r); } } void resp_delete (resp_list *rl, resp *dead) { resp *scan; #ifdef FUNCTIONS puts ("**resp_delete"); #endif if ((rl == NULL) || (rl->head == NULL)) return; if (rl->head == dead) { rl->head = dead->next; if (rl->head == NULL) rl->tail = NULL; (rl->priority_total) -= dead->priority; (rl->size)--; free (dead->response); free (dead); } else { for (scan = rl->head; (scan->next != NULL) && (scan->next != dead); scan = scan->next); if (scan->next != NULL) { if (scan->next == rl->tail) rl->tail = scan; scan->next = NULL; (rl->priority_total) -= dead->priority; (rl->size)--; free (dead->response); free (dead); } } } void resp_file_output (resp *r, FILE *f) { char tempio[10]; #ifdef FUNCTIONS puts ("**resp_file_output"); #endif sprintf (io, "%+-4d", r->lower); sprintf (tempio, "%+-4d", r->upper); fprintf (f, "%s to %s:% -4d:% 4d:%s", r->lowerflag ? io : "****", r->upperflag ? tempio : "****", r->status_change, r->priority, r->response); } void resp_parse_output (char *l, char *name, globals *g) { char *start, *end; #ifdef FUNCTIONS puts ("**resp_out_parse"); #endif for (start = end = l; *end != '\0';) { char *tempstr; for (; (*end != '\0') && (*end != '/') && (*end != '%'); end++); tempstr = clip (start, end - 1); socket_write_noret (g->socket, tempstr); free (tempstr); switch (*end) { case '/': start = ++end; case '\0': socket_write (g->socket, ""); break; case '%': switch (*(end + 1)) { case 'p': socket_write_noret (g->socket, name); socket_write_noret (g->socket, "'"); if (name[strlen (name) - 1] != 's') socket_write_noret (g->socket, "s"); break; case 'o': socket_write_noret (g->socket, name); break; case '%': socket_write_noret (g->socket, "%"); break; case 'r': if (g->room_current != NULL) { socket_write_noret (g->socket, g->room_current->name); } break; default: if ((*(end + 1) >= '0') && (*(end + 1) <= '9')) { sleep (atoi (end + 1)); } } end++; start = ++end; break; } } } resp *resp_find_num (resp_list *rl, int n) { resp *scan; #ifdef FUNCTIONS puts ("**resp_find_num"); #endif for (scan = rl->head; (scan != NULL) && (n > 1); scan = scan->next, n--); return scan; } resp *resp_find_pri (resp_list *rl, int n) { resp *scan; #ifdef FUNCTIONS puts ("**resp_find_pri"); #endif for (scan = rl->head; (scan != NULL) && (n >= scan->priority); scan = scan->next, n -= scan->priority); return scan; }