static const char *parse_option(int *argc, const char *argv[], const char *argv_[]) { int i, argc_ = 0; if (*argc <= 1) { fprintf(stderr, "usage: %s script.k\n", argv[0]); exit(EXIT_FAILURE); } for (i = 0; i < *argc; ++i) { kbytes_t t = B(argv[i]); if (knh_bytes_equals(t, STEXT("--emit-llvm"))) { compile_mode = EMIT_LLVM; continue; } if (knh_bytes_equals(t, STEXT("--emit-js"))) { compile_mode = EMIT_JS; continue; } if (knh_bytes_equals(t, STEXT("--emit-c++"))) { compile_mode = EMIT_CPP; continue; } if (compile_mode == EMIT_LLVM && knh_bytes_equals(t, STEXT("--run"))) { compiler_run_main = 1; continue; } argv_[argc_++] = argv[i]; } konoha_ginit(argc_, argv_); *argc = argc_; return argv_[1]; }
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; }
knh_flag_t knh_StmtMETHOD_flag(Ctx *ctx, Stmt *o) { knh_flag_t flag = 0; if(IS_DictMap(DP(o)->metaDictMap)) { Object *v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("Virtual")); if(IS_NOTNULL(v)) { flag |= KNH_FLAG_MF_VIRTUAL; } v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("Abstract")); if(IS_NOTNULL(v)) { flag |= KNH_FLAG_MF_VIRTUAL; } v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("Private")); if(IS_NOTNULL(v)) { flag |= KNH_FLAG_MF_PRIVATE; } v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("Const")); if(IS_NOTNULL(v)) { flag |= KNH_FLAG_MF_CONST; } v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("Static")); if(IS_NOTNULL(v)) { flag |= KNH_FLAG_MF_STATIC; } } return flag; }
static knh_Actor_t *knh_Actor_new(CTX ctx, knh_bytes_t name, knh_bytes_t host, int port) { knh_Actor_t *actor = (knh_Actor_t *)new_O(Actor, knh_getcid(ctx, STEXT("Actor"))); KNH_INITv(actor->name, new_String2(ctx, CLASS_String, name.text, name.len, 0)); KNH_INITv(actor->host, new_String2(ctx, CLASS_String, host.text, host.len, 0)); actor->port = port; return actor; }
void *knh_path_dlopen(CTX ctx, knh_path_t *ph) { knh_bytes_t t = {{P_text(ph)}, ph->plen}; if(!knh_bytes_endsWith(t, STEXT(K_OSDLLEXT))) { knh_path_append(ctx, ph, 0/*sep*/, K_OSDLLEXT); } return knh_dlopen(ctx, P_text(ph) + ph->pbody); }
knh_bool_t knh_StmtMETA_isOverride(Ctx *ctx, Stmt *o) { if(IS_DictMap(DP(o)->metaDictMap)) { Object *v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("Override")); if(IS_NOTNULL(v)) return 1; } return 0; }
int main(int argc, const char *argv[]) { int i, argc_ = argc; const char *argv_[argc_]; const char *fname = parse_option(&argc_, argv, argv_); if (fname == NULL) { fprintf(stderr, "%s [--emit-llvm/--emit-js] file\n", argv[0]); return 1; } konoha_t konoha = konoha_open(); CTX ctx = konoha; kString *s = new_T(fname); knh_DictMap_set(ctx, ctx->share->props, new_T("script.name"), s); kArray *a = new_Array(ctx, CLASS_String, argc_); for(i = 2; i < argc_; i++) { knh_Array_add(ctx, a, new_String2(ctx, CLASS_String, argv_[i], knh_strlen(argv_[i]), SPOL_TEXT|SPOL_POOLALWAYS)); } knh_DictMap_set(ctx, ctx->share->props, new_T("script.argv"), a); kbytes_t t = knh_bytes_nsname(S_tobytes(s)); knh_Script_setNSName(ctx, ctx->script, new_S(t.text, t.len)); kbytes_t pkgname = STEXT("konoha.compiler"); knh_loadPackage(ctx, pkgname); load_codegenerator(ctx); if (!compiler_run_main) { knh_setCompileMode(ctx, 1); } knh_startScript(ctx, (const char*)fname); /* CompilerAPI->dump() */ kMethod *mtd = load_method(ctx, O_cid(ctx->share->konoha_compiler), STEXT("dump")); BEGIN_LOCAL(ctx, lsfp, K_CALLDELTA+1); { KNH_SETv(ctx, lsfp[K_CALLDELTA].o, ctx->share->konoha_compiler); KNH_SCALL(ctx, lsfp, 0, mtd, 0); } END_LOCAL(ctx, lsfp); if (compiler_run_main) { knh_stack_clear(ctx, ctx->stack); knh_runMain(ctx, argc_, argv_); } konoha_close(konoha); return 0; }
KNHAPI(int) knh_bytes_parseURLscheme(knh_bytes_t url, char *buf, size_t bufsiz) { knh_index_t loc = knh_bytes_index(url, ':'); if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') { knh_format_bytes(buf, bufsiz, knh_bytes_first(url, loc)); return 1; } knh_format_bytes(buf, bufsiz, STEXT("http")); // default return 0; }
knh_flag_t knh_StmtPRINT_flag(Ctx *ctx, Stmt *o) { knh_flag_t flag = 0; if(IS_bDictMap(DP(o)->metaDictMap)) { Object *v = knh_DictMap_get__b(ctx, DP(o)->metaDictMap, STEXT("time")); if(IS_NOTNULL(v)) { flag |= KNH_FLAG_PF_TIME; } } return flag; }
kString* knh_getPropertyNULL(CTX, kbytes_t key) { if(knh_bytes_startsWith_(key, STEXT("env."))) { CWB_t cwbbuf, *cwb = CWB_open(_ctx, &cwbbuf); CWB_nzenvkey(_ctx, cwb, knh_bytes_last(key, 4)); char *v = knh_getenv(CWB_totext(_ctx, cwb)); CWB_close(_ctx, cwb); if(v == NULL) return NULL; return new_kString(v, knh_strlen(v), SPOL_ASCII|SPOL_POOL); } return (kString*)knh_DictMap_getNULL(_ctx, ctx->share->props, key); }
knh_String_t* knh_getPropertyNULL(Ctx *ctx, knh_bytes_t key) { if(knh_bytes_startsWith(key, STEXT("env."))) { knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf); knh_cwb_nzenvkey(ctx, cwb, knh_bytes_last(key, 4)); char *v = knh_getenv(knh_cwb_tochar(ctx, cwb)); knh_cwb_close(cwb); if(v == NULL) return NULL; return new_S(ctx, B(v)); } return (knh_String_t*)knh_DictMap_getNULL(ctx, DP(ctx->sys)->props, key); }
KNHAPI(knh_bytes_t) knh_bytes_substringURLpath(knh_bytes_t url) { knh_index_t loc = knh_bytes_index(url, ':'); if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') { knh_bytes_t t = knh_bytes_last(url, loc+3); loc = knh_bytes_index(t, '@'); if(loc > 0) t = knh_bytes_last(t, loc+1); loc = knh_bytes_index(t, '/'); if(loc > 0) { return t = knh_bytes_last(t, loc); } } return STEXT("/"); }
static void load_codegenerator(CTX ctx) { KONOHA_BEGIN(ctx); CompilerAPI_disable(ctx); if (codegenerator_file[compile_mode]) { kbytes_t t = new_bytes((char*)codegenerator_file[compile_mode]); knh_loadPackage(ctx, t); CWB_t cwbbuf, *cwb = CWB_open(ctx, &cwbbuf); kString *s = (kString *) knh_DictMap_getNULL(ctx, ctx->share->props, STEXT("konoha.package.path")); CWB_clear(cwb, 0); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 0, S_tobytes(s)); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 1, STEXT("konoha.compiler")); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 1, STEXT("compiler")); knh_buff_addpath(ctx, cwb->ba, cwb->pos, 0, STEXT(K_OSDLLEXT)); void *p = knh_dlopen(ctx, CWB_totext(ctx, cwb)); typedef void (*knh_Fpkgcomplete)(CTX); knh_Fpkgcomplete pkgcomplete = (knh_Fpkgcomplete) knh_dlsym(ctx, p, "reset_compiler_api", NULL, 1); if (pkgcomplete) pkgcomplete(ctx); CWB_close(ctx, cwb); } CompilerAPI_enable(ctx); KONOHA_END(ctx); }
KNHAPI(int) knh_bytes_parseURLpath(knh_bytes_t url, char *buf, size_t bufsiz) { knh_index_t loc = knh_bytes_index(url, ':'); if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') { knh_bytes_t t = knh_bytes_last(url, loc+3); loc = knh_bytes_index(t, '@'); if(loc > 0) t = knh_bytes_last(t, loc+1); loc = knh_bytes_index(t, '/'); if(loc > 0) { knh_format_bytes(buf, bufsiz, knh_bytes_last(t, loc)); } return 1; } knh_format_bytes(buf, bufsiz, STEXT("/")); return 0; }
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; } } }
static void knh_StmtMETA_dump(Ctx *ctx, Stmt *o, OutputStream *w, String *m) { if(!IS_DictMap(DP(o)->metaDictMap)) return ; int i = 0, size = (DP(o)->metaDictMap)->size; for(i = 0; i < size; i++) { String *k = (String*)knh_DictMap_keyAt(DP(o)->metaDictMap, i); String *v = (String*)knh_DictMap_valueAt(DP(o)->metaDictMap, i); if(k == v) { knh_printf(ctx, w, "@%s ", knh_String_tochar(k)); } else { knh_printf(ctx, w, "@%s(%O) ", knh_String_tochar(k), v); } } if(size > 0) { knh_println(ctx, w, STEXT("")); } }
KNHAPI(int) knh_bytes_parseURLuname(knh_bytes_t url, char *buf, size_t bufsiz) { knh_index_t loc = knh_bytes_index(url, ':'); if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') { knh_bytes_t t = knh_bytes_last(url, loc+3); loc = knh_bytes_index(t, '@'); if(loc > 0) { t = knh_bytes_first(t, loc); loc = knh_bytes_index(t, ':'); if(loc > 0) { t = knh_bytes_first(t, loc); } knh_format_bytes(buf, bufsiz, t); return 1; } } knh_format_bytes(buf, bufsiz, STEXT("konoha")); // default return 0; }
int konoha_main(konoha_t konoha, int argc, const char **argv) { CTX ctx = (CTX)konoha; int i, ret = 0, n = knh_parseopt(ctx, argc, argv); knh_linkDynamicReadline(ctx); knh_linkDynamicRegex(ctx); knh_linkDynamicIconv(ctx); for (i = 0; konoha_modules[i].init != NULL; ++i) { konoha_modules[i].init(argc, n, argv); } argc = argc - n; argv = argv + n; if(isActorMode) { char portstr[6] = {0}; knh_snprintf(portstr, sizeof(portstr), "%d", port); const char *argv_actor[3] = {"actsrv", portstr, NULL}; argc = 2; argv = argv_actor; } knh_parsearg(ctx, argc, argv); if(argc == 0) { ret = konoha_shell(ctx, NULL); } else if(isMPIMode) { kMPI_argv0 = argv[0]; knh_loadPackage(ctx, STEXT("konoha.mpi")); knh_eval(ctx, "using konoha.mpi.*; int main(String[] args) { new TaskScript().exec(MPI.vload()); MPI.vmainloop(); return 0 }", 1, NULL); ret = knh_runMain(ctx, argc, argv); } else { if(knh_startScript(ctx, argv[0]) == K_CONTINUE && !knh_isCompileOnly(ctx)) { ret = knh_runMain(ctx, argc, argv); if(isInteractiveMode) { konoha_shell(ctx, NULL); } } } for (i = 0; konoha_modules[i].exit != NULL; ++i) { konoha_modules[i].exit(); } return ret; }
knh_Fmethod knh_gluefunc(CTX ctx, kMethod *mtd, kNameSpace *ns, kDictMap *mdata) { knh_Fmethod gluefunc = NULL; kObject *gluedata = knh_DictMap_getNULL(ctx, mdata, STEXT("gluefunc")); if(gluedata != NULL && IS_bString(gluedata)) { if(ns->gluehdr == NULL) { DBG_P("gluehdr is not open"); } else { gluefunc = (knh_Fmethod)knh_dlsym(ctx, ns->gluehdr, S_totext((kString*)gluedata), NULL, 0); if(gluefunc == NULL) { DBG_P("gluefunc is not found: %s", S_totext((kString*)gluedata)); } } } //if(gluefunc == NULL) { // gluefunc = Fmethod_FFI; //} return gluefunc; }
static METHOD knh__Regex_new(Ctx *ctx, knh_sfp_t *sfp) { knh_Regex_t *o = (Regex*)sfp[0].o; knh_bytes_t p = knh_String_tobytes(sfp[1].s); knh_index_t loc = knh_bytes_index(p, ':'); KNH_SETv(ctx, o->pattern, sfp[1].s); if(loc == -1) { o->df = knh_System_getRegexDriver(ctx, STEXT("re")); } else { o->df = knh_System_getRegexDriver(ctx, knh_bytes_first(p, loc)); } o->reg = o->df->regmalloc(ctx); { char *ptn = (char*)(knh_bytes_last(p, loc+1).buf); char *opt = IS_NULL(sfp[2].o) ? "" : knh_String_tochar(sfp[2].s); o->df->regcomp(ctx, o->reg, ptn, opt); } KNH_RETURN(ctx, sfp, sfp[0].o); }
static int knh_runMain(CTX ctx, int argc, const char **argv) { KONOHA_BEGIN(ctx); kMethod *mtd = ClassTBL_getMethodNULL(ctx, O_cTBL(ctx->script), MN_main); int res = 0; if(mtd != NULL) { int thisidx = 1 + K_CALLDELTA; BEGIN_LOCAL(ctx, lsfp, 5); lsfp[1].ivalue = 0; lsfp[thisidx+K_PCIDX].pc = NULL; klr_setmtdNC(ctx,lsfp[thisidx+K_MTDIDX], mtd); KNH_SETv(ctx, lsfp[thisidx].o, ctx->script); KNH_SETv(ctx, lsfp[thisidx+1].o, knh_getPropertyNULL(ctx, STEXT("script.argv"))); klr_setesp(ctx, lsfp + thisidx+2); if(knh_VirtualMachine_launch(ctx, lsfp + thisidx)) { res = (int)lsfp[1].ivalue; } END_LOCAL(ctx, lsfp); } KONOHA_END(ctx); return res; }
METHOD knh__System_setMethodCompilationListener(Ctx *ctx, knh_sfp_t *sfp) { String *key; if(IS_NULL(sfp[2].s)) { key = T__("MethodC"); } else { knh_cwb_t cwbbuf, *cwb = knh_cwb_openinit(ctx, &cwbbuf, STEXT("MethodC")); knh_bytes_t anno = knh_String_tobytes(sfp[2].s); if(anno.buf[0] != '@') { knh_cwb_putc(ctx, cwb, '@'); } knh_cwb_write(ctx, cwb, anno); key = knh_cwb_newString(ctx, cwb); } KNH_LOCK(ctx, LOCK_SYSTBL, NULL); { DictMap *dm = DP(ctx->sys)->listenerDictMap; knh_DictMap_set(ctx, dm, key, sfp[1].o); } KNH_UNLOCK(ctx, LOCK_SYSTBL, NULL); KNH_RETURN_void(ctx, sfp); }
void knh_vprintf(Ctx *ctx, knh_OutputStream_t *w, const char *fmt, va_list ap) { knh_valist_t args[10]; const char *c = fmt; int i, ch, bindex = 0, bindex_max = 10; for(i = 0; i < bindex_max; i++) args[i].atype = 0; while((ch = *c) != '\0') { c++; if(ch == '%') { int index; ch = *c; if(ch == '%') { c++; continue; } index = bindex++; c = knh_vprintf_parseindex(c++, &index); //DBG_P("bindex=%d, index=%d", bindex, index); switch(ch) { case 'd': case 'u': args[index].atype = VA_DIGIT; break; case 'l': case 'i': args[index].atype = VA_LONG; break; case 'f': case 'e': args[index].atype = VA_FLOAT; break; case 's': args[index].atype = VA_CHAR; break; case 'p': args[index].atype = VA_POINTER; break; case 'L': case 'K': case 'k': case 'O': case 'o': args[index].atype = VA_OBJECT; break; case 'N': case 'F': args[index].atype = VA_FIELDN; break; case 'M': args[index].atype = VA_METHODN; break; case 'C': args[index].atype = VA_CLASS; break; case 'T': args[index].atype = VA_TYPE; break; case 'B': args[index].atype = VA_BYTES; break; // TODO // we should care if "fmt" has "%%". // sometimes, next args is NULL. case '%': index--; c++; default: bindex--; } if(bindex == 10) { DBG_ASSERT(bindex < 10); break; } } } for(i = 0; i < 10; i++) { switch(args[i].atype) { case VA_DIGIT: args[i].dvalue = (knh_intptr_t)va_arg(ap, knh_intptr_t); break; case VA_LONG: args[i].ivalue = (knh_int_t)va_arg(ap, knh_int_t); break; case VA_FLOAT: #if defined(K_USING_NOFLOAT) args[i].fvalue = (knh_float_t)va_arg(ap, knh_float_t); #else args[i].fvalue = (knh_float_t)va_arg(ap, double); #endif break; case VA_CHAR: args[i].svalue = (char*)va_arg(ap, char*); break; case VA_POINTER: args[i].pvalue = (void*)va_arg(ap, void*); break; case VA_OBJECT: args[i].ovalue = (Object*)va_arg(ap, Object*); break; case VA_FIELDN: args[i].fn = (knh_fieldn_t)va_arg(ap, int/*knh_fieldn_t*/); break; case VA_METHODN: args[i].mn = (knh_methodn_t)va_arg(ap, int/*knh_methodn_t*/); break; case VA_CLASS: args[i].cid = (knh_class_t)va_arg(ap, int/*knh_class_t*/); break; case VA_TYPE: args[i].type = (knh_type_t)va_arg(ap, int/*knh_type_t*/); break; case VA_BYTES: args[i].bvalue = (knh_bytes_t)va_arg(ap, knh_bytes_t); break; default: bindex_max = i; goto L_FORMAT; } } L_FORMAT: { knh_bytes_t b; knh_Method_t *mtd = NULL; knh_sfp_t *esp = ctx->esp; c = fmt; bindex = 0; b.text = c; b.len = 0; while((ch = *c) != '\0') { c++; if(ch == '\\') { if(b.len > 0) { knh_print(ctx, w, b); } ch = *c; switch(ch) { case '\0' : return ; case 'n': knh_println(ctx, w, STEXT("")); break; case 't': knh_write_TAB(ctx, w); break; default: knh_putc(ctx, w, '\\'); knh_putc(ctx, w, ch); } b.text = c; b.len = 0; } else if(ch == '%') { if(b.len > 0) { knh_print(ctx, w, b); } ch = *c; if(ch == '%') { knh_putc(ctx, w, '%'); c++; b.text = c; b.len = 0; continue; } int index = bindex++; c = knh_vprintf_parseindex(++c, &index); switch(ch) { case '\0' : return ; case 'd': DBG_ASSERT(args[index].atype == VA_DIGIT); knh_write_dfmt(ctx, w, K_INTPTR_FMT, args[index].dvalue); break; case 'u': DBG_ASSERT(args[index].atype == VA_DIGIT); knh_write_dfmt(ctx, w, K_INTPTR_UFMT, args[index].uvalue); break; case 'l': case 'i' : DBG_ASSERT(args[index].atype == VA_LONG); knh_write_ifmt(ctx, w, K_INT_FMT, args[index].ivalue); break; case 'f': DBG_ASSERT(args[index].atype == VA_FLOAT); knh_write_ffmt(ctx, w, K_FLOAT_FMT, args[index].fvalue); break; case 'e': DBG_ASSERT(args[index].atype == VA_FLOAT); knh_write_ffmt(ctx, w, K_FLOAT_FMTE, args[index].fvalue); break; case 's': DBG_ASSERT(args[index].atype == VA_CHAR); knh_write(ctx, w, B(args[index].svalue)); break; case 'p': DBG_ASSERT(args[index].atype == VA_POINTER); knh_write__p(ctx, w, args[index].pvalue); break; case 'L': DBG_ASSERT(args[index].atype == VA_OBJECT); if(IS_Token(args[index].ovalue)) { knh_write_token(ctx, w, (knh_Token_t*)args[index].ovalue); break; } case 'O': case 'o': DBG_ASSERT(args[index].atype == VA_OBJECT); mtd = knh_getSystemFormatter(ctx, knh_Object_cid(args[index].ovalue), MN__s); knh_write_Object(ctx, w, esp, &mtd, args[index].ovalue); break; case 'K': case 'k': DBG_ASSERT(args[index].atype == VA_OBJECT); mtd = knh_getSystemFormatter(ctx, knh_Object_cid(args[index].ovalue), MN__k); knh_write_Object(ctx, w, esp, &mtd, args[index].ovalue); break; case 'N': case 'F': DBG_ASSERT(args[index].atype == VA_FIELDN); knh_write_text(ctx, w, FN__(args[index].fn)); break; case 'M': DBG_ASSERT(args[index].atype == VA_METHODN); knh_write_mn(ctx, w, args[index].mn); break; case 'C': DBG_ASSERT(args[index].atype == VA_CLASS); knh_write_sname(ctx, w, args[index].cid); break; case 'T': DBG_ASSERT(args[index].atype == VA_TYPE); knh_write_type(ctx, w, args[index].type); break; case 'B': DBG_ASSERT(args[index].atype == VA_BYTES); knh_write(ctx,w, args[index].bvalue); break; case '%': index--; bindex--; default: //knh_putc(ctx, w, '%'); knh_putc(ctx, w, ch); } b.text = c; b.len = 0; if(!(bindex <= bindex_max)) { DBG_ASSERT(bindex <= bindex_max); break; } } else { b.len = b.len+1; } } if(b.len > 0) { knh_print(ctx, w, b); } } }
void knh_System_initPath(CTX) { CWB_t cwbbuf, *cwb = CWB_open(_ctx, &cwbbuf); kDictMap *sysprops = ctx->share->props; kbytes_t home = {{NULL}, 0}, user = {{NULL}, 0}; // current working directory knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, STEXT(".")); KSETv(ctx->share->rootks->path, new_Path(_ctx, knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos))); home.text = (const char*)knh_getenv("KONOHAHOME"); #if defined(K_KONOHAHOME) if(home.text == NULL) { home.text = K_KONOHAHOME; } #endif if(home.text != NULL) { home.len = knh_strlen(home.text); SETPROP("konoha.home.path", new_T(home.text)); } #if defined(K_USING_WINDOWS_) { char buf[K_PATHMAX]; int bufsiz = K_PATHMAX; HMODULE h = LoadLibrary(NULL); GetModuleshortnameA(h, buf, bufsiz); CWB_clear(cwb, 0); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, B(buf)); SETPROP("konoha.bin.path", knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos)); if(home.text == NULL) { kString *s; CWB_clear(cwb, 0); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, B(buf)); knh_buff_trim(_ctx, cwb->ba, cwb->pos, '\\'); knh_buff_trim(_ctx, cwb->ba, cwb->pos, '\\'); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*isSep*/, STEXT("konoha")); s = CWB_newString(_ctx, cwb, 0); SETPROP("konoha.home.path", s); home = S_tobytes(s); } } #elif defined(K_USING_LINUX_) // @url(http://shinh.skr.jp/binary/b2con.html) // http://doc.trolltech.com/3.3/qapplication.html#applicationDirPath { char buf[K_PATHMAX]; int bufsiz = K_PATHMAX; ssize_t size = readlink("/proc/self/exe", buf, bufsiz); CWB_clear(cwb, 0); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, new_bytes2(buf, size)); SETPROP("konoha.bin.path", knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos)); if(home.text == NULL) { kString *s; CWB_clear(cwb, 0); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, new_bytes2(buf, size)); knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/'); knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/'); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*isSep*/, STEXT("konoha")); s = CWB_newString(_ctx, cwb, 0); SETPROP("konoha.home.path", s); home = S_tobytes(s); } } #elif defined(K_USING_MACOSX_) { kString *binpath; CWB_clear(cwb, 0); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, B(_dyld_get_image_name(0))); binpath = knh_buff_newRealPathString(_ctx, cwb->ba, cwb->pos); SETPROP("konoha.bin.path", binpath); if(home.text == NULL) { CWB_clear(cwb, 0); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, S_tobytes(binpath)); knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/'); knh_buff_trim(_ctx, cwb->ba, cwb->pos, '/'); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*isSep*/, STEXT("konoha")); kString *s = CWB_newString(_ctx, cwb, 0); SETPROP("konoha.home.path", s); home = S_tobytes(s); } } #else home = STEXT("/opt/konoha"); SETPROP("konoha.home.path", new_T("/opt/konoha")); #endif DBG_ASSERT(home.utext != NULL); /* $konoha.package.path {$konoha.home.path}/package */ CWB_clear(cwb, 0); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, home); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT("package")); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(LIBK_VERSION)); SETPROP("konoha.package.path", CWB_newString(_ctx, cwb, 0)); /* $konoha.script.path {$konoha.home.path}/script */ knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, home); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT("script")); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(LIBK_VERSION)); SETPROP("konoha.script.path", CWB_newString(_ctx, cwb, 0)); #if defined(K_USING_WINDOWS_) user.text = knh_getenv("USERPROFILE"); #else user.text = knh_getenv("HOME"); #endif if(user.text != NULL) { /* $user.path */ user.len = knh_strlen(user.text); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 0, user); knh_buff_addpath(_ctx, cwb->ba, cwb->pos, 1, STEXT(K_KONOHAFOLDER)); SETPROP("user.path", CWB_newString(_ctx, cwb, 0)); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, user); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1, STEXT(K_KONOHAFOLDER)); knh_buff_mkdir(_ctx, cwb->ba, cwb->pos); CWB_clear(cwb, 0); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 0, user); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(K_KONOHAFOLDER)); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT("package")); knh_buff_addospath(_ctx, cwb->ba, cwb->pos, 1/*sep*/, STEXT(LIBK_VERSION)); SETPROP("user.package.path", CWB_newString(_ctx, cwb, 0)); } CWB_close(_ctx, cwb); }
void knh_System_initPath(CTX ctx, knh_System_t *o) { knh_DictMap_t *sysprops = DP(o)->props; knh_path_t phbuf, *ph = knh_path_open(ctx, NULL, ".", &phbuf); knh_bytes_t home = {{NULL}, 0}, user = {{NULL}, 0}; // current working directory knh_ospath(ctx, ph); KNH_SETv(ctx, ctx->share->rootns->rpath, knh_path_newString(ctx, ph, 0)); home.text = (const char*)knh_getenv("KONOHAHOME"); #if defined(K_KONOHAHOME) if(home.text == NULL) { home.text = K_KONOHAHOME; } #endif if(home.text != NULL) { home.len = knh_strlen(home.text); SETPROP("konoha.home.path", new_T(home.text)); } #if defined(K_USING_WINDOWS) { char buf[FILEPATH_BUFSIZ]; int bufsiz = FILEPATH_BUFSIZ; HMODULE h = LoadLibrary(NULL); GetModuleFileNameA(h, buf, bufsiz); ph = knh_path_open_(ctx, NULL, B(buf), &phbuf); SETPROP("konoha.bin.path", knh_path_newString(ctx, ph, 0)); if(homepath == NULL) { knh_String_t *s; GetModuleFileNameA(h, buf, bufsiz); knh_path_reduce(ctx, ph, '/'); s = knh_path_newString(ctx, ph); SETPROP("konoha.home.path", UPCAST(s)); home = S_tobytes(shome); } } #elif defined(K_USING_LINUX_) // @url(http://shinh.skr.jp/binary/b2con.html) // http://doc.trolltech.com/3.3/qapplication.html#applicationDirPath { char buf[FILEPATH_BUFSIZ]; int bufsiz = FILEPATH_BUFSIZ; size_t size = readlink("/proc/self/exe", buf, bufsiz); ph = knh_path_open_(ctx, NULL, new_bytes2(buf, size), &phbuf); SETPROP("konoha.bin.path", knh_path_newString(ctx, ph, 0)); if(home.text == NULL) { knh_String_t *s; knh_path_reduce(ctx, ph, '/'); knh_path_reduce(ctx, ph, '/'); knh_path_append(ctx, ph, 1/*isSep*/, "konoha"); s = knh_path_newString(ctx, ph, 0/*hasScheme*/); SETPROP("konoha.home.path", UPCAST(s)); home = S_tobytes(s); } } #elif defined(K_USING_MACOSX_) ph = knh_path_open(ctx, NULL, _dyld_get_image_name(0), &phbuf); knh_ospath(ctx, ph); SETPROP("konoha.bin.path", knh_path_newString(ctx, ph, 0/*hasScheme*/)); if(home.text == NULL) { knh_String_t *s; knh_path_reduce(ctx, ph, '/'); knh_path_reduce(ctx, ph, '/'); knh_path_append(ctx, ph, 1/*isSep*/, "konoha"); s = knh_path_newString(ctx, ph, 0/*hasScheme*/); SETPROP("konoha.home.path", UPCAST(s)); home = S_tobytes(s); } #else home = STEXT("/opt/konoha"); SETPROP("konoha.home.path", new_T("/opt/konoha")); #endif DBG_ASSERT(home.utext != NULL); /* $konoha.package.path {$konoha.home.path}/package */ knh_path_reset(ctx, ph, NULL, home); knh_path_append(ctx, ph, 1/*sep*/, "package"); knh_path_append(ctx, ph, 1/*sep*/, LIBK_VERSION); SETPROP("konoha.package.path", knh_path_newString(ctx, ph, 0/*hasScheme*/)); /* $konoha.script.path {$konoha.home.path}/script */ knh_path_reset(ctx, ph, NULL, home); knh_path_append(ctx, ph, 1/*sep*/, "script"); knh_path_append(ctx, ph, 1/*sep*/, LIBK_VERSION); SETPROP("konoha.script.path", knh_path_newString(ctx, ph, 0/*hasScheme*/)); #if defined(K_USING_WINDOWS) user.text = knh_getenv("USERPROFILE"); #else user.text = knh_getenv("HOME"); #endif if(user.text != NULL) { /* $user.path */ user.len = knh_strlen(user.text); knh_path_reset(ctx, ph, NULL, user); knh_path_append(ctx, ph, 1/*sep*/, K_KONOHAFOLDER); SETPROP("user.path", knh_path_newString(ctx, ph, 0)); knh_ospath(ctx, ph); knh_path_mkdir(ctx, ph); knh_path_reset(ctx, ph, NULL, user); /* user.package.path */ knh_path_append(ctx, ph, 1/*sep*/, K_KONOHAFOLDER); knh_path_append(ctx, ph, 1/*sep*/, "package"); knh_path_append(ctx, ph, 1/*sep*/, LIBK_VERSION); SETPROP("user.package.path", knh_path_newString(ctx, ph, 0)); } knh_path_close(ctx, ph); }
static void opt_help(CTX ctx, int mode, const char *optstr) { kString* home = knh_getPropertyNULL(ctx, STEXT("konoha.home.path")); fprintf(stdout, HELPMSG, S_totext(home), knh_getSystemEncoding()); exit(0); }
{ kConnection *o = (kConnection*)sfp[0].o; knh_Connection_open(ctx, o, sfp[1].s); RETURN_(sfp[0].o); } /* ------------------------------------------------------------------------ */ //## method ResultSet! Connection.query(String query); #define K_DEFAULT_DSPI STEXT("") KMETHOD Connection_query(CTX ctx, ksfp_t *sfp _RIX) { kConnection *c = (kConnection*)sfp[0].o; kString *query = (kString*)sfp[1].o; kResultSet *rs = (kResultSet*)new_O(ResultSet, knh_getcid(ctx, STEXT("ResultSet"))); KNH_RCSETv(ctx, sfp[2].o, rs); kqcur_t *qcur = (c)->dspi->qexec(ctx, (c)->conn, S_tobytes(query), rs); if(qcur != NULL) { DP(rs)->qcur = qcur; DP(rs)->qcurfree = (c)->dspi->qcurfree; } else { DP(rs)->qcur = NULL; DP(rs)->qcurfree = NULL; //DP(rs)->qcurfree = knh_getQueryDSPI(ctx, K_DEFAULT_DSPI)->qcurfree; } KNH_SETv(ctx, DP(rs)->conn, c); RETURN_(rs); }
/* added by Wakamori */ void loadPolicy(CTX ctx) { if (enforce_security == 0) return; // load $konoha.home.path/policy knh_setProperty(ctx, new_String(ctx, "role"), (dynamic *)new_String(ctx, role)); CWB_t cwbbuf, *cwb = CWB_open0(ctx, &cwbbuf); kString *s = knh_getPropertyNULL(ctx, STEXT("konoha.home.path")); CWB_write(ctx, cwb, S_tobytes(s)); CWB_write(ctx, cwb, STEXT("/policy")); kInputStream *is = new_InputStream(ctx, NULL, new_Path(ctx, CWB_newString0(ctx, cwb))); if (is == NULL) { DBG_P("policy file not found. All @Restricted annotated method is rescricted"); } else { /* if (enforce_security == 0) { enforce_security = 1; knh_memcpy(role, "Default", 7); role[7] = '\0'; } */ // parse policy file written in JSON // it must be refactored in the future kDictMap *dmap = ctx->share->securityDictMap; kString *line = knh_InputStream_readLine(ctx, is); while (IS_NOTNULL(line)) { //fprintf(stderr, "line=%s\n", S_totext(line)); if (S_equals(line, STEXT("[")) || S_equals(line, STEXT("]"))) { /* ignore */ } else { kString *key = NULL; kArray *a = new_Array(ctx, CLASS_String, 0); const char *idx = NULL; char *p = strstr(S_totext(line), "\"name\": \""); if (p != NULL) { p += 9; // == strlen("\"name\": \"") idx = strchr((const char *)p, '"'); if (idx != NULL) { p[idx - p] = '\0'; //fprintf(stderr, "name: %s\n", p); //knh_DictMap_set(ctx, dmap, new_String(ctx, "name"), new_String(ctx, p)); key = new_String(ctx, p); p = (char *)idx + 1; } } p = strstr((const char *)p, "\"permission\": ["); if (p != NULL) { p += 16; // == strlen("\"permission\": \[\"") idx = strchr((const char *)p, '"'); while (idx != NULL) { p[idx - p] = '\0'; if (strstr((const char *)p, ", ") == NULL) { //fprintf(stderr, "permission: %s\n", p); knh_Array_add(ctx, a, new_String(ctx, p)); } p = (char *)idx + 1; idx = strchr((const char *)p, '"'); } } if (key != NULL) { knh_DictMap_set(ctx, dmap, key, a); } } line = knh_InputStream_readLine(ctx, is); } knh_InputStream_close(ctx, is); } }