static int func_getvar (void *vo, const char *name, NCDValMem *mem, NCDValRef *out) { struct instance *o = vo; if (!strcmp(name, "succeeded")) { *out = ncd_make_boolean(mem, o->succeeded, o->i->params->iparams->string_index); return 1; } size_t pos; uintmax_t n; if ((pos = string_begins_with(name, "match")) && parse_unsigned_integer(MemRef_MakeCstr(name + pos), &n)) { if (o->succeeded && n < MAX_MATCHES && o->matches[n].rm_so >= 0) { regmatch_t *m = &o->matches[n]; ASSERT(m->rm_so <= o->input.len) ASSERT(m->rm_eo >= m->rm_so) ASSERT(m->rm_eo <= o->input.len) size_t len = m->rm_eo - m->rm_so; *out = NCDVal_NewStringBinMr(mem, MemRef_Sub(o->input, m->rm_so, len)); return 1; } } return 0; }
static void func_new_from_value (NCDModuleInst *i) { // read arguments NCDValue *arg_value; if (!NCDValue_ListRead(i->args, 1, &arg_value)) { ModuleLog(i, BLOG_ERROR, "wrong arity"); goto fail0; } if (NCDValue_Type(arg_value) != NCDVALUE_STRING) { ModuleLog(i, BLOG_ERROR, "wrong type"); goto fail0; } // parse value uintmax_t value; if (!parse_unsigned_integer(NCDValue_StringValue(arg_value), &value)) { ModuleLog(i, BLOG_ERROR, "wrong value"); goto fail0; } // check overflow if (value > SIZE_MAX) { ModuleLog(i, BLOG_ERROR, "value too large"); goto fail0; } func_new_templ(i, value); return; fail0: NCDModuleInst_Backend_SetError(i); NCDModuleInst_Backend_Dead(i); }
void change_c::parse_value() { switch (m_property.m_type) { case property_element_c::EBMLT_STRING: parse_ascii_string(); break; case property_element_c::EBMLT_USTRING: parse_unicode_string(); break; case property_element_c::EBMLT_UINT: parse_unsigned_integer(); break; case property_element_c::EBMLT_INT: parse_signed_integer(); break; case property_element_c::EBMLT_BOOL: parse_boolean(); break; case property_element_c::EBMLT_BINARY: parse_binary(); break; case property_element_c::EBMLT_FLOAT: parse_floating_point_number(); break; default: assert(false); } }
static int parse_number (NCDModuleInst *i, MemRef str, NCDValMem *mem, NCDValRef *out) { uintmax_t n; if (!parse_unsigned_integer(str, &n)) { ModuleLog(i, BLOG_ERROR, "failed to parse number"); return 0; } *out = ncd_make_uintmax(mem, n); if (NCDVal_IsInvalid(*out)) { return 0; } return 1; }
static void client_handler (struct instance *o, char *devpath, int have_map, BStringMap map) { if (o->devpath && !strcmp(devpath, o->devpath) && !NCDUdevManager_Query(o->i->params->iparams->umanager, o->devpath)) { // free devpath free(o->devpath); // set no devpath o->devpath = NULL; // signal down NCDModuleInst_Backend_Down(o->i); } else { const BStringMap *cache_map = NCDUdevManager_Query(o->i->params->iparams->umanager, devpath); if (!cache_map) { goto out; } int match_res = regexec(&o->reg, devpath, 0, NULL, 0); const char *interface = BStringMap_Get(cache_map, "INTERFACE"); const char *ifindex_str = BStringMap_Get(cache_map, "IFINDEX"); uintmax_t ifindex; if (!(!match_res && interface && MemRef_Equal(MemRef_MakeCstr(interface), o->ifname) && ifindex_str && parse_unsigned_integer(MemRef_MakeCstr(ifindex_str), &ifindex))) { goto out; } if (o->devpath && (strcmp(o->devpath, devpath) || o->ifindex != ifindex)) { // free devpath free(o->devpath); // set no devpath o->devpath = NULL; // signal down NCDModuleInst_Backend_Down(o->i); } if (!o->devpath) { // grab devpath o->devpath = devpath; devpath = NULL; // remember ifindex o->ifindex = ifindex; // signal up NCDModuleInst_Backend_Up(o->i); } } out: free(devpath); if (have_map) { BStringMap_Free(&map); } }
int main(int argc, char *argv[]) { int max_users = 1000; int user_count = 0; if (argc < 2) { fprintf(stderr, "Usage: bff_book input_file.txt [max_users]\n"); return 1; } if (argc > 2) { if (parse_unsigned_integer(argv[2], &max_users) < 0) { fprintf(stderr, "Failed to parse argument %s\n", argv[2]); return 1; } if (max_users < 0) { fprintf(stderr, "Invalid value for max_users\n"); return 1; } } FILE *fp = fopen(argv[1], "rb"); if (fp == NULL) { fprintf(stderr, "Error opening %s\n", argv[1]); return 1; } int i, j; struct tree_node *root = NULL; struct bff_user **users = calloc(max_users, sizeof(struct bff_user *)); if (users == NULL) { perror("calloc"); return 1; } /* Distances between users not used in part 1. */ int **dist = calloc(max_users, sizeof(int *)); if (dist == NULL) { perror("calloc"); return 1; } for (i=0; i<max_users; i++) { dist[i] = calloc(max_users, sizeof(int)); if (dist[i] == NULL) { perror("calloc"); return 1; } } for (i=0; i<max_users; i++) { for (j=0; j<max_users; j++) { dist[i][j] = MAX_DIST; } } /* Edges between users, 1 bff 0 for not-bff. */ int **edge = calloc(max_users, sizeof(int *)); if (edge == NULL) { perror("calloc"); return 1; } for (i=0; i<max_users; i++) { edge[i] = calloc(max_users, sizeof(int)); if (edge[i] == NULL) { perror("calloc"); return 1; } } char *lineptr = NULL; size_t n_chars; for (;;) { /* Read a line from the input file. */ free(lineptr); lineptr = NULL; if (getline(&lineptr, &n_chars, fp) < 0) { free(lineptr); break; } struct bff_user new_user; int userid; int userid_from, userid_to; char name[100]; char piece_of_info[100]; if (sscanf(lineptr, "create_user %d, %[^,],%[^,],%[^,]\n", &userid, name, new_user.summary, new_user.profile) == 4) { if (userid < 0 || userid >= max_users) { printf("Create_user failed: userid %d exceeds the range 0 to maximum %d\n", userid, max_users - 1); continue; } new_user.key.userid = userid; strcpy(new_user.name, name); new_user.key.bff_count = 0; printf("Create_user %d %s %s %s\n", userid, new_user.name, new_user.summary, new_user.profile); users[userid] = tree_insert(&root, new_user); tree_print(root); if (tree_validate(root) < 0) { abort(); } user_count++; dist[userid][userid] = 0; printf("Edges:\n"); print_matrix(edge, user_count); print_bff_counts(users, user_count); } else if (sscanf(lineptr, "delete_user %d\n", &userid) == 1) { printf("Delete_user %d\n", userid); struct bff_user user; struct tree_node *node = NULL; if (users[userid]) { user = *users[userid]; node = tree_delete(&root, &user.key); /* Sometimes useful debug code: */ /* printf("Found node %p with bff_count %d and userid %d:\n", node, user.key.bff_count, user.key.userid); if (node) { printf("node->key.bff_count = %d node->key.userid = %d\n", node->data.key.bff_count, node->data.key.userid); } printf("After user deletion:\n"); tree_print(root); printf(".\n"); */ free(node); /* Now clear distances for deleted id */ for (i=0; i<user_count; i++) { if (edge[userid][i] > 0) { update_popularity_tree(users, &root, i, -1); } edge[userid][i] = 0; edge[i][userid] = 0; } update_distances_full(dist, edge, user_count); } } else if (sscanf(lineptr, "bff %d, %d\n", &userid_from, &userid_to) == 2) { printf("Bff %d %d\n", userid_from, userid_to); edge[userid_from][userid_to] = 1; edge[userid_to][userid_from] = 1; update_distances_incrementally(dist, userid_from, userid_to, user_count); update_popularity_tree(users, &root, userid_from, +1); //tree_print(root); update_popularity_tree(users, &root, userid_to, +1); //tree_print(root); printf("Edges:\n"); print_matrix(edge, user_count); print_bff_counts(users, user_count); /* Commented out for project part 1. */ /* printf("Distances:\n"); print_matrix(dist, user_count); */ } else if (sscanf(lineptr, "unbff %d, %d\n", &userid_from, &userid_to) == 2) { printf("Unbff %d %d\n", userid_from, userid_to); if (edge[userid_from][userid_to] == 0) { printf("Unbff %d and %d are not bffs.\n", userid_from, userid_to); continue; } edge[userid_from][userid_to] = 0; edge[userid_to][userid_from] = 0; update_distances_full(dist, edge, user_count); update_popularity_tree(users, &root, userid_from, -1); //tree_print(root); update_popularity_tree(users, &root, userid_to, -1); //tree_print(root); printf("Edges:\n"); print_matrix(edge, user_count); print_bff_counts(users, user_count); /* Commented out for project part 1. */ /* printf("Distances:\n"); print_matrix(dist, user_count); */ } else if (sscanf(lineptr, "read %d, %d, %[^,\n]\n", &userid_to, &userid_from, piece_of_info) == 3) { printf("Read %d %d %s\n", userid_to, userid_from, piece_of_info); int d = dist[userid_from][userid_to]; int denied = 1; if (!strcmp(piece_of_info, "profile")) { if (d <= 1) { printf("Read %s: %s\n", piece_of_info, users[userid_from]->profile); denied = 0; } } else if (!strcmp(piece_of_info, "summary")) { if (d <= 2) { printf("Read %s: %s\n", piece_of_info, users[userid_from]->summary); denied = 0; } } else if (!strcmp(piece_of_info, "bffs")) { if (d <= 3) { printf("Read %s: \n", piece_of_info); denied = 0; } } else if (!strcmp(piece_of_info, "name")) { if (d <= 4) { printf("Read %s: %s\n", piece_of_info, users[userid_from]->name); denied = 0; } } else { printf("Read %s failed: Unkown record.\n", piece_of_info); denied = 0; } if (denied) { printf("Read %s: Permission denied, insufficient distance %d.\n", piece_of_info, d); } } else if (!strcmp(lineptr, "rank\n")) { printf("Rank:\n"); tree_print(root); printf(".\n"); } else { printf("Unrecognized command: %s\n", lineptr); } } if (ferror(fp)) { perror("read"); } printf("Exiting...\n"); printf("Final rank:\n"); tree_print(root); tree_destroy(root); for (i=0; i<max_users; i++) { free(dist[i]); } free(dist); for (i=0; i<max_users; i++) { free(edge[i]); } free(edge); free(users); fclose(fp); return 0; }