ksymbol_t knh_getfnq(CTX, kbytes_t tname, ksymbol_t def) { ksymbol_t mask = 0; kindex_t idx = knh_bytes_index(tname, ':'); if(idx > 0) { tname = knh_bytes_first(tname, idx); } else if(knh_bytes_startsWith_(tname, STEXT("super."))) { mask = (def == FN_NONAME) ? 0 : KFLAG_FN_SUPER; tname = knh_bytes_last(tname, 6); } else if(!knh_bytes_endsWith_(tname, STEXT("__"))) { if(tname.utext[0] == '_' && def != FN_NONAME) { mask = KFLAG_FN_U1; tname = knh_bytes_last(tname, 1); } if(tname.utext[0] == '_' && def != FN_NONAME) { mask = KFLAG_FN_U2; tname = knh_bytes_last(tname, 1); } while(tname.utext[0] == '_') { tname = knh_bytes_last(tname, 1); } } return getSymbol(_ctx, tname, def) | mask; }
void konoha_ginit(int argc, const char **argv) { int n; stdlog = stderr; knh_syslog = pseudo_syslog; knh_vsyslog = pseudo_vsyslog; for(n = 1; n < argc; n++) { const char *t = argv[n]; if(t[0] == '-' && (isalnum(t[1]) || t[1] == '-')) { knh_optdata_t *d = knh_getoptdata(t); int optnum = 1; // default const char* optstr = NULL; // default if(d == NULL) continue; if(d->type == OPT_NUMBER) { t += d->len; if(t[0] == '=') t++; if(isalnum(t[0])) { kint_t v = 0; knh_bytes_parseint(B((char*)t), &v); optnum = (int)v; } } else if(d->type == OPT_STRING) { t += d->len; if(t[0] == '=') { optstr = t + 1; } else if(t[0] != 0) { optstr = t; } else if(n + 1 < argc) { n++; optstr = argv[n]; if(optstr[0] == '-') { n--; optstr = NULL; } if(knh_bytes_endsWith_(B(optstr), STEXT(".k"))) { break; } } } d->setopt(optnum, optstr); continue; } } }