int zrex_hits (zrex_t *self, const char *text) { assert (self); assert (text); assert (self->trex); unsigned int index; for (index = 0; index < self->hits; index++) { free (self->hit [index]); self->hit [index] = NULL; } bool matched = !!trex_match (self->trex, text); if (matched) { // Get number of hits, setting a sane limit self->hits = trex_getsubexpcount (self->trex); if (self->hits > MAX_HITS) self->hits = MAX_HITS; } else self->hits = 0; return self->hits; }
static int reMatchTX (RegExpInfo *rx, const char *str) { if (!rx->tx) return 0; rx->bos = str; return trex_match(rx->tx, str)==TRex_True ? 1 : 0; }
/** * \brief Parse a string * \param mess_src The string to parse. * \return A Message created from the parameter. */ struct Message* mess__parse(char* mess_src) { if(!isEverythingInitialized) mess__base__init(); if(!mess_src) return NULL; struct Message* mess_dest; mess__init(&mess_dest); int i; int match = 0; char * ptr, *tmp2; for(i = 0; i < MESS__NB_REGEXES; i++) // trouver le moyen de staticifier ça { if(trex_match(trex_regexes[i], mess_src)) { match = 1; break; } } if(match == 0) i = -1; char * tmp = malloc((strlen(mess_src) + 1)* sizeof(char)); switch(i) { case 0: mess_dest->type = LOAD; mess_dest->s_parameter = str_sub(mess_src, 5, strlen(mess_src) - 1); break; case 1: mess_dest->type = SAVE; mess_dest->s_parameter = str_sub(mess_src, 5, strlen(mess_src) - 1); break; case 2: mess_dest->type = SHOW; break; case 3: mess_dest->type = ADDLINK; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); mess_dest->node2 = strcopy(strtok(NULL, " ")); mess_dest->n_parameter = atoi(strtok(NULL, " ")); break; case 4: mess_dest->type = UPDATELINK; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); mess_dest->node2 = strcopy(strtok(NULL, " ")); mess_dest->n_parameter = atoi(strtok(NULL, " ")); break; case 5: mess_dest->type = DELLINK; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); mess_dest->node2 = strcopy(strtok(NULL, " ")); break; case 6: mess_dest->type = DISCONNECT; strtok(mess_src, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); break; case 7: mess_dest->type = MESSAGE; strcpy(tmp, mess_src); strtok(tmp, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); ptr = strstr(mess_src, mess_dest->node1) + strlen(mess_dest->node1) + 2; mess_dest->s_parameter = malloc((1 + strlen(ptr)) * sizeof(char)); strcpy(mess_dest->s_parameter, ptr); mess_dest->s_parameter[strlen(ptr) - 1] = 0; break; case 8: mess_dest->type = ROUTE; strtok(mess_src, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); break; case 9: mess_dest->type = ROUTETABLE; break; case 10: mess_dest->type = LOGIN; strtok(mess_src, " "); strtok(NULL, " "); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->n_parameter = atoi(strtok(NULL, " ")); break; case 11: mess_dest->type = LOGIN; //log in port p strtok(mess_src, " "); strtok(NULL, " "); strtok(NULL, " "); mess_dest->n_parameter = atoi(strtok(NULL, " ")); break; case 12: mess_dest->type = LOGOUT; break; case 13: mess_dest->type = GREETING; strtok(mess_src, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); break; case 14: mess_dest->type = BYE; break; case 15: mess_dest->type = POLL; break; case 16: mess_dest->type = NEIGHBORHOOD; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->s_parameter = strcopy(strtok(NULL, " ")); break; case 17: mess_dest->type = NEIGHBORHOOD; mess_dest->accept = OK; break; case 18: mess_dest->type = LINK; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); break; case 19: mess_dest->type = LINK; mess_dest->accept = OK; break; case 20: mess_dest->type = VECTOR; strtok(mess_src, " "); mess_dest->s_parameter = strcopy(strtok(NULL, " ")); break; case 21: mess_dest->type = VECTOR; mess_dest->accept = OK; break; case 22: mess_dest->type = PACKET; strcpy(tmp, mess_src); strtok(tmp, " "); strtok(NULL, " "); mess_dest->seqnum = atoi(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node2 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); tmp2 = strtok(NULL, " "); mess_dest->n_parameter = atoi(tmp2); mess_dest->s_parameter = strcopy(strtok(NULL, "\0") + 5); //strstr(mess_src, tmp2) + strlen(tmp2) + 1; break; case 23: mess_dest->type = PACKET; mess_dest->accept = OK; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->seqnum = atoi(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node2 = strcopy(strtok(NULL, " ")); break; case 24: mess_dest->type = PACKET; mess_dest->accept = TOOFAR; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->seqnum = atoi(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node2 = strcopy(strtok(NULL, " ")); break; case 25: mess_dest->type = PING; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->seqnum = atoi(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node2 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->n_parameter = atoi(strtok(NULL, " ")); break; case 26: mess_dest->type = PONG; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->seqnum = atoi(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node2 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->n_parameter = atoi(strtok(NULL, " ")); break; case 27: mess_dest->type = PONG; mess_dest->accept = TTLZERO; strtok(mess_src, " "); strtok(NULL, " "); mess_dest->seqnum = atoi(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); strtok(NULL, " "); mess_dest->node2 = strcopy(strtok(NULL, " ")); break; case 28: mess_dest->type = PING; strtok(mess_src, " "); mess_dest->node1 = strcopy(strtok(NULL, " ")); break; case 29: mess_dest->type = QUIT; break; case 30: mess_dest->type = NEIGHBORHOOD; mess_dest->s_parameter = malloc(sizeof(char)); mess_dest->s_parameter[0] = 0; break; case 31: mess_dest->type = VECTOR; mess_dest->s_parameter = malloc(sizeof(char) * 3); mess_dest->s_parameter[0] = '['; mess_dest->s_parameter[1] = ']'; mess_dest->s_parameter[2] = 0; break; case 32: mess_dest->type = NETWORK_DEBUG; break; default: mess_dest->type = NONE; fprintf(stderr, "ERREUR: Message invalide : '%s'.\n", mess_src); break; } free(tmp); return mess_dest; }