static foreign_t pl_order_table_mapping(term_t handle, term_t from, term_t to, control_t ctrl) { OrdTable t; int f; if ( !get_order_table(handle, &t) ) return FALSE; if ( PL_get_integer(from, &f) && f >= 0 && f <= 255 ) return unify_mapped_code(to, ORD(t, f)); if ( PL_is_variable(from) ) { switch(PL_foreign_control(ctrl)) { case PL_FIRST_CALL: f = 0; break; case PL_REDO: f = (int)PL_foreign_context(ctrl); break; case PL_PRUNED: return TRUE; } while( f <= 255 && !unify_mapped_code(to, ORD(t, f)) ) f++; if ( f <= 255 ) { if ( !PL_unify_integer(from, f) ) return FALSE; PL_retry(f+1); } return FALSE; } return FALSE; }
static void copy_table(OrdTable to, OrdTable from) { int i; to->magic = ORD_MAGIC; for(i=0; i<256; i++) ORD(to, i) = ORD(from, i); }
static void iso_latin_1_case_table(OrdTable ot) { int i; iso_latin_1_table(ot); for(i=0; i<=255; i++) { int o = ORD(ot, i); if ( o >= 'A' && o <= 'Z' ) ORD(ot, i) = o + ('a' - 'A'); } }
static int compare_strings_(const char *s1, const char **S2, size_t n, OrdTable ot) { const char *e1 = s1 + n; const char *s2 = *S2; for(;;) { int o1, o2; if ( s1 == e1 ) { *S2 = s2; return 0; /* equal */ } o1 = ORD(ot, *s1); o2 = ORD(ot, *s2); if ( o1 == o2 ) { if ( o1 == ORD_END ) { *S2 = s2; return 0; /* equal */ } if ( o1 == ORD_BREAK ) /* a break, loop on both */ { while(ORD(ot, *s1) == ORD_BREAK) s1++; while(ORD(ot, *s2) == ORD_BREAK) s2++; continue; } s1++; s2++; continue; } /* ignore stuff */ if ( o1 == ORD_IGNORE ) { s1++; continue; } if ( o2 == ORD_IGNORE ) { s2++; continue; } return o1 < o2 ? -1 : 1; } }
static int parse_set(OrdTable ot, atom_t name, term_t set) { term_t c = PL_new_term_ref(); int type; if ( name == ATOM_break ) type = ORD_BREAK; else if ( name == ATOM_ignore ) type = ORD_IGNORE; else if ( name == ATOM_tag ) type = ORD_TAG; else return FALSE; while(PL_get_list(set, c, set)) { int i; if ( !get_char(c, &i) ) return FALSE; ORD(ot, i) = type; } return PL_get_nil(set); }
static void ilt (float x, float y, int ok) { TEST (ORD (x, y) && UNLT (x, y)); /* Not optimized */ TEST ((x <= y) && (x != y)); TEST ((x <= y) && (y != x)); TEST ((x != y) && (x <= y)); /* Not optimized */ TEST ((y != x) && (x <= y)); /* Not optimized */ }
int igt (float x, float y, int ok) { TEST (ORD (x, y) && UNGT (x, y)); /* Not optimized */ TEST ((x >= y) && (x != y)); TEST ((x >= y) && (y != x)); TEST ((x != y) && (x >= y)); /* Not optimized */ TEST ((y != x) && (x >= y)); /* Not optimized */ }
int ige (float x, float y, int ok) { TEST (ORD (x, y) && UNGE (x, y)); /* Not optimized */ TEST ((x > y) || (x == y)); TEST ((y < x) || (x == y)); TEST ((x == y) || (x > y)); /* Not optimized */ TEST ((y == x) || (x > y)); /* Not optimized */ }
static void case_insensitive_table(OrdTable ot) { int i; ot->magic = ORD_MAGIC; for(i='A'; i<='Z'; i++) ORD(ot, i) = i + ('a' - 'A'); }
static void exact_table(OrdTable ot) { int i; ot->magic = ORD_MAGIC; for(i=0; i<256; i++) ORD(ot, i) = i; }
int iltgt (float x, float y, int ok) { TEST (!UNEQ (x, y)); /* Not optimizable. */ TEST (LTGT (x, y)); /* Same, __builtin_islessgreater does not trap. */ TEST (ORD (x, y) && (UNLT (x, y) || UNGT (x,y))); }
int ieq (float x, float y, int ok) { TEST (ORD (x, y) && UNEQ (x, y)); }
static void ieq (float x, float y, int ok) { TEST (ORD (x, y) && UNEQ (x, y)); }
static void vfptreef(struct shf *shf, int indent, const char *fmt, va_list va) { int c; while ((c = ord(*fmt++))) { if (c == '%') { switch ((c = ord(*fmt++))) { case ORD('c'): /* character (octet, probably) */ shf_putchar(va_arg(va, int), shf); break; case ORD('s'): /* string */ shf_puts(va_arg(va, char *), shf); break; case ORD('S'): /* word */ wdvarput(shf, va_arg(va, char *), 0, WDS_TPUTS); break; case ORD('d'): /* signed decimal */ shf_fprintf(shf, Tf_d, va_arg(va, int)); break; case ORD('u'): /* unsigned decimal */ shf_fprintf(shf, "%u", va_arg(va, unsigned int)); break; case ORD('T'): /* format tree */ ptree(va_arg(va, struct op *), indent, shf); goto dont_trash_prevent_semicolon; case ORD(';'): /* newline or ; */ case ORD('N'): /* newline or space */ if (shf->flags & SHF_STRING) { if ((unsigned int)c == ORD(';') && !prevent_semicolon) shf_putc(';', shf); shf_putc(' ', shf); } else { int i; shf_putc('\n', shf); i = indent; while (i >= 8) { shf_putc('\t', shf); i -= 8; } while (i--) shf_putc(' ', shf); } break; case ORD('R'): /* I/O redirection */ pioact(shf, va_arg(va, struct ioword *)); break; default: shf_putc(c, shf); break; } } else shf_putc(c, shf); prevent_semicolon = false; dont_trash_prevent_semicolon: ; }
static void iso_latin_1_table(OrdTable ot) { int i; exact_table(ot); ORD(ot, 192) = 'A'; ORD(ot, 193) = 'A'; ORD(ot, 194) = 'A'; ORD(ot, 195) = 'A'; ORD(ot, 196) = 'A'; ORD(ot, 197) = 'A'; ORD(ot, 199) = 'C'; ORD(ot, 200) = 'E'; ORD(ot, 201) = 'E'; ORD(ot, 202) = 'E'; ORD(ot, 203) = 'E'; ORD(ot, 204) = 'I'; ORD(ot, 205) = 'I'; ORD(ot, 206) = 'I'; ORD(ot, 207) = 'I'; ORD(ot, 208) = 'D'; ORD(ot, 209) = 'N'; ORD(ot, 210) = 'O'; ORD(ot, 211) = 'O'; ORD(ot, 212) = 'O'; ORD(ot, 213) = 'O'; ORD(ot, 214) = 'O'; ORD(ot, 216) = 'O'; ORD(ot, 217) = 'U'; ORD(ot, 218) = 'U'; ORD(ot, 219) = 'U'; ORD(ot, 220) = 'U'; ORD(ot, 221) = 'Y'; ORD(ot, 223) = 'S'; /* german SS */ for(i=224; i<=253; i++) { if ( i == 230 || /* ae */ i == 247 ) /* x and / */ continue; ORD(ot, i) = ORD(ot, i-32) + 'a' - 'A'; } }
/* module advertising code */ static int module_open(Evas_Module *em) { if (!em) return 0; /* get whatever engine module we inherit from */ if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; _evas_log_dom_module = eina_log_domain_register("Software_DDraw", EVAS_DEFAULT_LOG_COLOR); if(_evas_log_dom_module < 0) { EINA_LOG_ERR("Can not create a module log domain."); return 0; } /* store it for later use */ func = pfunc; /* now to override methods */ #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) ORD(info); ORD(info_free); ORD(setup); ORD(canvas_alpha_get); ORD(output_free); ORD(output_resize); ORD(output_tile_size_set); ORD(output_redraws_rect_add); ORD(output_redraws_rect_del); ORD(output_redraws_clear); ORD(output_redraws_next_update_get); ORD(output_redraws_next_update_push); ORD(output_flush); ORD(output_idle_flush); /* now advertise out own api */ em->functions = (void *)(&func); return 1; }
static foreign_t pl_new_order_table(term_t name, term_t options) { OrdTable t = malloc(sizeof(ordtable)); term_t tail = PL_copy_term_ref(options); term_t head = PL_new_term_ref(); exact_table(t); if ( !PL_get_atom(name, &t->name) ) { free(t); return error(ERR_INSTANTIATION, "new_order_table/2", 1, name); } while(PL_get_list(tail, head, tail)) { atom_t name; int arity; if ( PL_get_name_arity(head, &name, &arity) ) { if ( name == ATOM_case_insensitive ) { case_insensitive_table(t); } else if ( name == ATOM_iso_latin_1 ) { iso_latin_1_table(t); } else if ( name == ATOM_iso_latin_1_case_insensitive ) { iso_latin_1_case_table(t); } else if ( name == ATOM_copy && arity == 1 ) { term_t a = PL_new_term_ref(); OrdTable from; _PL_get_arg(1, head, a); if ( get_order_table(a, &from) ) { copy_table(t, from); } else { free(t); return FALSE; } } else if ( arity == 1 ) { fid_t fid = PL_open_foreign_frame(); term_t a = PL_new_term_ref(); _PL_get_arg(1, head, a); if ( !parse_set(t, name, a) ) goto err1; PL_close_foreign_frame(fid); } else if ( name == ATOM_eq && arity == 2 ) { fid_t fid = PL_open_foreign_frame(); term_t c = PL_new_term_ref(); int from, to; if ( !PL_get_arg(1, head, c) || !get_char(c, &from) || !PL_get_arg(2, head, c) || !get_char(c, &to) ) { free(t); return FALSE; } ORD(t, from) = to; PL_close_foreign_frame(fid); } else goto err1; } else { err1: free(t); return error(ERR_INSTANTIATION, "new_order_table/2", 2, options); } } if ( !PL_get_nil(tail) ) goto err1; register_table(t); PL_succeed; }
/* variant of fputs for ptreef and wdstrip */ static const char * wdvarput(struct shf *shf, const char *wp, int quotelevel, int opmode) { int c; const char *cs; /*- * problems: * `...` -> $(...) * 'foo' -> "foo" * x${foo:-"hi"} -> x${foo:-hi} unless WDS_TPUTS * x${foo:-'hi'} -> x${foo:-hi} * could change encoding to: * OQUOTE ["'] ... CQUOTE ["'] * COMSUB [(`] ...\0 (handle $ ` \ and maybe " in `...` case) */ while (/* CONSTCOND */ 1) switch (*wp++) { case EOS: return (--wp); case ADELIM: if (ord(*wp) == ORD(/*{*/ '}')) { ++wp; goto wdvarput_csubst; } /* FALLTHROUGH */ case CHAR: c = ord(*wp++); shf_putc(c, shf); break; case QCHAR: c = ord(*wp++); if (opmode & WDS_TPUTS) switch (c) { case ORD('\n'): if (quotelevel == 0) { c = ORD('\''); shf_putc(c, shf); shf_putc(ORD('\n'), shf); } break; default: if (quotelevel == 0) /* FALLTHROUGH */ case ORD('"'): case ORD('`'): case ORD('$'): case ORD('\\'): shf_putc(ORD('\\'), shf); break; } shf_putc(c, shf); break; case COMASUB: case COMSUB: shf_puts("$(", shf); cs = ")"; if (ord(*wp) == ORD('(' /*)*/)) shf_putc(' ', shf); pSUB: while ((c = *wp++) != 0) shf_putc(c, shf); shf_puts(cs, shf); break; case FUNASUB: case FUNSUB: c = ORD(' '); if (0) /* FALLTHROUGH */ case VALSUB: c = ORD('|'); shf_putc('$', shf); shf_putc('{', shf); shf_putc(c, shf); cs = ";}"; goto pSUB; case EXPRSUB: shf_puts("$((", shf); cs = "))"; goto pSUB; case OQUOTE: if (opmode & WDS_TPUTS) { quotelevel++; shf_putc('"', shf); } break; case CQUOTE: if (opmode & WDS_TPUTS) { if (quotelevel) quotelevel--; shf_putc('"', shf); } break; case OSUBST: shf_putc('$', shf); if (ord(*wp++) == ORD('{')) shf_putc('{', shf); while ((c = *wp++) != 0) shf_putc(c, shf); wp = wdvarput(shf, wp, 0, opmode); break; case CSUBST: if (ord(*wp++) == ORD('}')) { wdvarput_csubst: shf_putc('}', shf); } return (wp); case OPAT: shf_putchar(*wp++, shf); shf_putc('(', shf); break; case SPAT: c = ORD('|'); if (0) /* FALLTHROUGH */ case CPAT: c = ORD(/*(*/ ')'); shf_putc(c, shf); break; } }
int ile (float x, float y, int ok) { TEST (ORD (x, y) && UNLE (x, y)); /* Not optimized */ TEST ((x < y) || (x == y)); TEST ((y > x) || (x == y)); TEST ((x == y) || (x < y)); /* Not optimized */ TEST ((y == x) || (x < y)); /* Not optimized */ }