value_t fl_accum_julia_symbol(value_t *args, u_int32_t nargs) { argcount("accum-julia-symbol", nargs, 2); ios_t *s = fl_toiostream(args[1], "accum-julia-symbol"); if (!iscprim(args[0]) || ((cprim_t*)ptr(args[0]))->type != wchartype) type_error("accum-julia-symbol", "wchar", args[0]); uint32_t wc = *(uint32_t*)cp_data((cprim_t*)ptr(args[0])); ios_t str; ios_mem(&str, 0); while (jl_id_char(wc)) { ios_getutf8(s, &wc); if (wc == '!') { uint32_t nwc; ios_peekutf8(s, &nwc); // make sure != is always an operator if (nwc == '=') { ios_ungetc('!', s); break; } } ios_pututf8(&str, wc); if (ios_peekutf8(s, &wc) == IOS_EOF) break; } ios_pututf8(&str, 0); return symbol(normalize(str.buf)); }
value_t fl_accum_julia_symbol(fl_context_t *fl_ctx, value_t *args, uint32_t nargs) { argcount(fl_ctx, "accum-julia-symbol", nargs, 2); ios_t *s = fl_toiostream(fl_ctx, args[1], "accum-julia-symbol"); if (!iscprim(args[0]) || ((cprim_t*)ptr(args[0]))->type != fl_ctx->wchartype) type_error(fl_ctx, "accum-julia-symbol", "wchar", args[0]); uint32_t wc = *(uint32_t*)cp_data((cprim_t*)ptr(args[0])); ios_t str; int allascii=1; ios_mem(&str, 0); do { allascii &= (wc <= 0x7f); ios_getutf8(s, &wc); if (wc == '!') { uint32_t nwc; ios_peekutf8(s, &nwc); // make sure != is always an operator if (nwc == '=') { ios_ungetc('!', s); break; } } ios_pututf8(&str, wc); if (ios_peekutf8(s, &wc) == IOS_EOF) break; } while (jl_id_char(wc)); ios_pututf8(&str, 0); return symbol(fl_ctx, allascii ? str.buf : normalize(fl_ctx, str.buf)); }
value_t fl_julia_identifier_char(value_t *args, u_int32_t nargs) { argcount("identifier-char?", nargs, 1); if (!iscprim(args[0]) || ((cprim_t*)ptr(args[0]))->type != wchartype) type_error("identifier-char?", "wchar", args[0]); uint32_t wc = *(uint32_t*)cp_data((cprim_t*)ptr(args[0])); return jl_id_char(wc) ? FL_T : FL_F; }
value_t fl_julia_identifier_char(fl_context_t *fl_ctx, value_t *args, uint32_t nargs) { argcount(fl_ctx, "identifier-char?", nargs, 1); if (!iscprim(args[0]) || ((cprim_t*)ptr(args[0]))->type != fl_ctx->wchartype) type_error(fl_ctx, "identifier-char?", "wchar", args[0]); uint32_t wc = *(uint32_t*)cp_data((cprim_t*)ptr(args[0])); return jl_id_char(wc) ? fl_ctx->T : fl_ctx->F; }
JL_DLLEXPORT int jl_is_identifier(char *str) { size_t i = 0; uint32_t wc = u8_nextchar(str, &i); if (!jl_id_start_char(wc)) return 0; while ((wc = u8_nextchar(str, &i)) != 0) { if (!jl_id_char(wc)) return 0; } return 1; }