int resolve_selector(const char *sel) { try_initialize(); if(sel == NULL || sel[0] == '\0') { fprintf(stderr,"Empty or null selectors not allowed\n"); abort(); } int *res = bytecode_hash_table_get(&symbol_table,sel); if(res==NULL) { return new_selector(sel); } else { return *res; } }
abstract_css_selector *css_selector_reader::create_single_selector (const char *str) { trim_whitespace_left (str); unique_ptr <simple_selector> selector (new simple_selector); if (!selector->create_from_string (str)) return nullptr; unique_ptr <abstract_css_selector> result (selector.release ()); while (*str) { char combinator = get_combinator (str); if (*str == '\0') return selector.release (); unique_ptr <simple_selector> new_selector (new simple_selector); if (!new_selector->create_from_string (str)) return nullptr; switch (combinator) { case ' ': result.reset (new descendant_selector (result.release (), new_selector.release ())); break; case '+': result.reset (new adjancent_selector (result.release (), new_selector.release ())); break; case '>': result.reset (new child_selector (result.release (), new_selector.release ())); break; default: return nullptr; } } return result.release (); }
static ERL_NIF_TERM read_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { ks_returner_t *ret; ERL_NIF_TERM term, statistics; ks_handle_t *handle; ks_instance_t *ksi; ks_nvpair_t *nvpair; char *ks_number; ks_selector_t *selector; int matched; ret = new_returner(env); if (argc < 1 || argc > 6) { return EKSTAT_RETURN(enif_make_badarg(ret->env)); } if (!enif_get_resource(env, argv[0], kstat_handle, (void **)(&handle))) { return EKSTAT_RETURN(enif_make_badarg(ret->env)); } selector = new_selector(ret); if (ret->ready == B_TRUE) { if ((void *)(selector) != NULL) { free_selector(selector); } return EKSTAT_RETURN(ret->term); } switch (argc) { case 2: (void) ks_selector_arg(ret, &selector->ks_class, argv[1]); break; case 3: (void) ks_selector_arg(ret, &selector->ks_class, argv[1]); (void) ks_selector_arg(ret, &selector->ks_module, argv[2]); break; case 4: (void) ks_selector_arg(ret, &selector->ks_class, argv[1]); (void) ks_selector_arg(ret, &selector->ks_module, argv[2]); (void) ks_selector_arg(ret, &selector->ks_instance, argv[3]); break; case 5: (void) ks_selector_arg(ret, &selector->ks_class, argv[1]); (void) ks_selector_arg(ret, &selector->ks_module, argv[2]); (void) ks_selector_arg(ret, &selector->ks_instance, argv[3]); (void) ks_selector_arg(ret, &selector->ks_name, argv[4]); break; case 6: (void) ks_selector_arg(ret, &selector->ks_class, argv[1]); (void) ks_selector_arg(ret, &selector->ks_module, argv[2]); (void) ks_selector_arg(ret, &selector->ks_instance, argv[3]); (void) ks_selector_arg(ret, &selector->ks_name, argv[4]); (void) ks_selector_arg(ret, &selector->ks_statistic, argv[5]); break; default: break; } if (ret->ready == B_TRUE) { free_selector(selector); return EKSTAT_RETURN(ret->term); } term = enif_make_list(env, 0); /* Iterate over each instance */ for (ksi = list_head(&handle->instances_list); ksi != NULL; ksi = list_next(&handle->instances_list, ksi)) { matched = 0; statistics = (ERL_NIF_TERM)(NULL); (void) asprintf(&ks_number, "%d", ksi->ks_instance); if ( !(ks_match(ret, ksi->ks_module, &selector->ks_module) && ks_match(ret, ksi->ks_name, &selector->ks_name) && ks_match(ret, ks_number, &selector->ks_instance) && ks_match(ret, ksi->ks_class, &selector->ks_class)) ) { free(ks_number); if (ret->ready == B_TRUE) { free_selector(selector); return EKSTAT_RETURN(ret->term); } continue; } free(ks_number); /* Finally iterate over each statistic */ for (nvpair = list_head(&ksi->ks_nvlist); nvpair != NULL; nvpair = list_next(&ksi->ks_nvlist, nvpair)) { if (!ks_match(ret, nvpair->name, &selector->ks_statistic)) { if (ret->ready == B_TRUE) { free_selector(selector); return EKSTAT_RETURN(ret->term); } continue; } if ((void *)(statistics) == NULL) { statistics = enif_make_list(env, 0); } matched = 1; statistics = enif_make_list_cell(env, ks_nvpair_term(ret, nvpair), statistics); } if (matched == 1) { term = enif_make_list_cell(env, ks_instance_term(ret, ksi, statistics), term); } } free_selector(selector); return EKSTAT_RETURN(term); }
int main(int argc, char **argv) { ks_selector_t *nselector; ks_selector_t *uselector; kstat_ctl_t *kc; hrtime_t start_n; hrtime_t period_n; boolean_t errflg = B_FALSE; boolean_t nselflg = B_FALSE; boolean_t uselflg = B_FALSE; char *q; int count = 1; int infinite_cycles = 0; int interval = 0; int n = 0; int c, m, tmp; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it wasn't */ #endif (void) textdomain(TEXT_DOMAIN); /* * Create the selector list and a dummy default selector to match * everything. While we process the cmdline options we will add * selectors to this list. */ list_create(&selector_list, sizeof (ks_selector_t), offsetof(ks_selector_t, ks_next)); nselector = new_selector(); /* * Parse named command line arguments. */ while ((c = getopt(argc, argv, "h?Cqjlpx:H:T:m:i:n:s:c:")) != EOF) switch (c) { case 'h': case '?': usage(); exit(0); break; case 'C': g_pflg = g_cflg = B_TRUE; break; case 'q': g_qflg = B_TRUE; break; case 'j': g_jflg = B_TRUE; break; case 'l': g_pflg = g_lflg = B_TRUE; break; case 'H': g_host = B_TRUE; tachyon_host = (char *)ks_safe_strdup(optarg); break; case 'x': g_url = g_pflg = g_nflg = B_TRUE; // If we use nsq we need to init curl globaly. tm_curl_global_init(); tachyon_url = (char *)ks_safe_strdup(optarg); break; case 'p': g_pflg = B_TRUE; break; case 'T': switch (*optarg) { case 'd': g_timestamp_fmt = DDATE; break; case 'u': g_timestamp_fmt = UDATE; break; default: errflg = B_TRUE; } break; case 'm': nselflg = B_TRUE; nselector->ks_module.pstr = (char *)ks_safe_strdup(optarg); break; case 'i': nselflg = B_TRUE; nselector->ks_instance.pstr = (char *)ks_safe_strdup(optarg); break; case 'n': nselflg = B_TRUE; nselector->ks_name.pstr = (char *)ks_safe_strdup(optarg); break; case 's': nselflg = B_TRUE; nselector->ks_statistic.pstr = (char *)ks_safe_strdup(optarg); break; case 'c': g_ks_class.pstr = (char *)ks_safe_strdup(optarg); break; default: errflg = B_TRUE; break; } if (g_qflg && (g_jflg || g_pflg || g_nflg)) { (void) fprintf(stderr, gettext( "-q and -lpjn are mutually exclusive\n")); errflg = B_TRUE; } if (g_url ^ g_host) { (void) fprintf(stderr, gettext( "-H and -x must both be set.\n")); errflg = B_TRUE; } if (errflg) { usage(); exit(2); } argc -= optind; argv += optind; /* * Consume the rest of the command line. Parsing the * unnamed command line arguments. */ while (argc--) { errno = 0; tmp = strtoul(*argv, &q, 10); if (tmp == ULONG_MAX && errno == ERANGE) { if (n == 0) { (void) fprintf(stderr, gettext( "Interval is too large\n")); } else if (n == 1) { (void) fprintf(stderr, gettext( "Count is too large\n")); } usage(); exit(2); } if (errno != 0 || *q != '\0') { m = 0; uselector = new_selector(); while ((q = (char *)strsep(argv, ":")) != NULL) { m++; if (m > 4) { free(uselector); usage(); exit(2); } if (*q != '\0') { switch (m) { case 1: uselector->ks_module.pstr = (char *)ks_safe_strdup(q); break; case 2: uselector->ks_instance.pstr = (char *)ks_safe_strdup(q); break; case 3: uselector->ks_name.pstr = (char *)ks_safe_strdup(q); break; case 4: uselector->ks_statistic.pstr = (char *)ks_safe_strdup(q); break; default: assert(B_FALSE); } } } uselflg = B_TRUE; list_insert_tail(&selector_list, uselector); } else { if (tmp < 1) { if (n == 0) { (void) fprintf(stderr, gettext( "Interval must be an " "integer >= 1")); } else if (n == 1) { (void) fprintf(stderr, gettext( "Count must be an integer >= 1")); } usage(); exit(2); } else { if (n == 0) { interval = tmp; count = -1; } else if (n == 1) { count = tmp; } else { usage(); exit(2); } } n++; } argv++; } /* * Check if we founded a named selector on the cmdline. */ if (uselflg) { if (nselflg) { (void) fprintf(stderr, gettext( "[module[:instance[:name[:statistic]]]] and " "-m -i -n -s are mutually exclusive")); usage(); exit(2); } else { free(nselector); } } else { list_insert_tail(&selector_list, nselector); } assert(!list_is_empty(&selector_list)); list_create(&instances_list, sizeof (ks_instance_t), offsetof(ks_instance_t, ks_next)); while ((kc = kstat_open()) == NULL) { if (errno == EAGAIN) { (void) poll(NULL, 0, 200); } else { perror("kstat_open"); exit(3); } } if (count > 1) { if (signal(SIGCONT, cont_handler) == SIG_ERR) { (void) fprintf(stderr, gettext( "signal failed")); exit(3); } } period_n = (hrtime_t)interval * NANOSEC; start_n = gethrtime(); while (count == -1 || count-- > 0) { ks_instances_read(kc); kstat_time = time(NULL); ks_instances_print(); if (interval && count) { ks_sleep_until(&start_n, period_n, infinite_cycles, &caught_cont); (void) kstat_chain_update(kc); if (! g_nflg) (void) putchar('\n'); } } (void) kstat_close(kc); return (g_matched); }