int trie_addr_maybe_update(char *buff, size_t len, int ipv4, int fd, struct sockaddr_storage *addr, size_t alen) { int ret; void *data; size_t dlen; struct ipv4hdr *hdr4 = (void *) buff; struct ipv6hdr *hdr6 = (void *) buff; data = ipv4 ? (void *) &hdr4->h_saddr : (void *) &hdr6->saddr; dlen = ipv4 ? sizeof(hdr4->h_saddr) : sizeof(hdr6->saddr); if (unlikely((ipv4 && ((struct ipv4hdr *) buff)->h_version != 4) || (!ipv4 && ((struct ipv6hdr *) buff)->version != 6))) return -1; rwlock_wr_lock(&tree_lock); ret = ptree_add_entry(data, dlen, fd, addr, alen, &tree); rwlock_unlock(&tree_lock); return ret; }
/** * Read word/class entry names and 1-gram data from LR 2-gram file. * * @param fp [in] file pointer * @param ndata [out] N-gram to set the read data. */ static boolean set_unigram(FILE *fp, NGRAM_INFO *ndata) { WORD_ID nid; int resid; LOGPROB prob, bo_wt; char *name, *p; boolean ok_p = TRUE; NGRAM_TUPLE_INFO *t; t = &(ndata->d[0]); /* malloc name area */ ndata->wname = (char **)mymalloc(sizeof(char *) * ndata->max_word_num); /* malloc data area */ //t->bgn_upper = t->bgn_lower = t->bgn = t->num = NULL; t->bgn_upper = NULL; t->bgn_lower = NULL; t->bgn = NULL; t->num = NULL; t->bgnlistlen = 0; t->nnid2wid = NULL; t->prob = (LOGPROB *)mymalloc_big(sizeof(LOGPROB), t->totalnum); t->bo_wt = (LOGPROB *)mymalloc_big(sizeof(LOGPROB), t->totalnum); t->context_num = t->totalnum; t->nnid2ctid_upper = NULL; t->nnid2ctid_lower = NULL; nid = 0; while (getl(buf, sizeof(buf), fp) != NULL && buf[0] != '\\') { if ((p = strtok(buf, DELM)) == NULL) { jlog("Error: ngram_read_arpa: 1-gram: failed to parse, corrupted or invalid data?\n"); return FALSE; } prob = (LOGPROB)atof(p); if ((p = strtok(NULL, DELM)) == NULL) { jlog("Error: ngram_read_arpa: 1-gram: failed to parse, corrupted or invalid data?\n"); return FALSE; } name = strcpy((char *)mymalloc(strlen(p)+1), p); if ((p = strtok(NULL, DELM)) == NULL) { bo_wt = 0.0; } else { bo_wt = (LOGPROB)atof(p); } /* register word entry name */ ndata->wname[nid] = name; /* add entry name to index tree */ if (ndata->root == NULL) { ndata->root = ptree_make_root_node(nid, &(ndata->mroot)); } else { resid = ptree_search_data(name, ndata->root); if (resid != -1 && strmatch(name, ndata->wname[resid])) { /* already exist */ jlog("Error: ngram_read_arpa: duplicate word entry \"%s\" at #%d and #%d in 1-gram\n", name, resid, nid); ok_p = FALSE; continue; } else { ptree_add_entry(name, nid, ndata->wname[resid], &(ndata->root), &(ndata->mroot)); } } if (nid >= ndata->max_word_num) { jlog("Error: ngram_read_arpa: num of 1-gram is bigger than header value (%d)\n", ndata->max_word_num); return FALSE; } /* register entry info */ t->prob[nid] = prob; t->bo_wt[nid] = bo_wt; nid++; } if (nid != t->totalnum) { jlog("Error: ngram_read_arpa: num of 1-gram (%d) not equal to header value (%d)\n", nid, t->totalnum); return FALSE; } if (ok_p == TRUE) { jlog("Stat: ngram_read_arpa: read %d 1-gram entries\n", nid); } return ok_p; }