#define SANITIZE_ARG \
context, \
(HB_DEBUG_SANITIZE ? sanitize_depth + 1 : 0)
-#define SANITIZE_ARG_INIT \
- &context, \
- 1
+
typedef struct _hb_sanitize_context_t hb_sanitize_context_t;
struct _hb_sanitize_context_t
struct Sanitizer
{
static hb_blob_t *sanitize (hb_blob_t *blob) {
- hb_sanitize_context_t context;
+ hb_sanitize_context_t context[1];
+ unsigned int sanitize_depth = 0;
bool sane;
/* TODO is_sane() stuff */
fprintf (stderr, "Sanitizer %p start %s\n", blob, __PRETTY_FUNCTION__);
#endif
- _hb_sanitize_init (&context, blob);
+ _hb_sanitize_init (context, blob);
/* Note: We drop const here */
- Type *t = CastP<Type> ((void *) context.start);
+ Type *t = CastP<Type> ((void *) context->start);
- sane = t->sanitize (SANITIZE_ARG_INIT);
+ sane = t->sanitize (SANITIZE_ARG);
if (sane) {
- if (context.edit_count) {
+ if (context->edit_count) {
#if HB_DEBUG_SANITIZE
fprintf (stderr, "Sanitizer %p passed first round with %d edits; doing a second round %s\n",
- blob, context.edit_count, __PRETTY_FUNCTION__);
+ blob, context->edit_count, __PRETTY_FUNCTION__);
#endif
/* sanitize again to ensure no toe-stepping */
- context.edit_count = 0;
- sane = t->sanitize (SANITIZE_ARG_INIT);
- if (context.edit_count) {
+ context->edit_count = 0;
+ sane = t->sanitize (SANITIZE_ARG);
+ if (context->edit_count) {
#if HB_DEBUG_SANITIZE
fprintf (stderr, "Sanitizer %p requested %d edits in second round; FAILLING %s\n",
- blob, context.edit_count, __PRETTY_FUNCTION__);
+ blob, context->edit_count, __PRETTY_FUNCTION__);
#endif
sane = false;
}
}
- _hb_sanitize_fini (&context, blob);
+ _hb_sanitize_fini (context, blob);
} else {
- unsigned int edit_count = context.edit_count;
- _hb_sanitize_fini (&context, blob);
+ unsigned int edit_count = context->edit_count;
+ _hb_sanitize_fini (context, blob);
if (edit_count && !hb_blob_is_writable (blob) && hb_blob_try_writable (blob)) {
/* ok, we made it writable by relocating. try again */
#if HB_DEBUG_SANITIZE
inline bool apply_once (hb_ot_layout_context_t *context,
hb_buffer_t *buffer,
unsigned int context_length,
- unsigned int nesting_level_left) const
+ unsigned int nesting_level_left,
+ unsigned int apply_depth) const
{
unsigned int lookup_type = get_type ();
unsigned int lookup_flag = get_flag ();
return false;
for (unsigned int i = 0; i < get_subtable_count (); i++)
- if (get_subtable (i).apply (APPLY_ARG_INIT, lookup_type))
+ if (get_subtable (i).apply (APPLY_ARG, lookup_type))
return true;
return false;
bool done;
if (~IN_MASK (buffer->in_pos) & mask)
{
- done = apply_once (context, buffer, NO_CONTEXT, MAX_NESTING_LEVEL);
+ done = apply_once (context, buffer, NO_CONTEXT, MAX_NESTING_LEVEL, 0);
ret |= done;
}
else
if (HB_UNLIKELY (context_length < 1))
return false;
- return l.apply_once (context, buffer, context_length, nesting_level_left);
+ return l.apply_once (context, buffer, context_length, nesting_level_left, apply_depth);
}
inline bool apply_once (hb_ot_layout_context_t *context,
hb_buffer_t *buffer,
unsigned int context_length,
- unsigned int nesting_level_left) const
+ unsigned int nesting_level_left,
+ unsigned int apply_depth) const
{
unsigned int lookup_type = get_type ();
unsigned int lookup_flag = get_flag ();
unsigned int count = get_subtable_count ();
for (unsigned int i = 0; i < count; i++)
- if (get_subtable (i).apply (APPLY_ARG_INIT, lookup_type))
+ if (get_subtable (i).apply (APPLY_ARG, lookup_type))
return true;
return false;
while (buffer->in_pos < buffer->in_length)
{
if ((~IN_MASK (buffer->in_pos) & mask) &&
- apply_once (context, buffer, NO_CONTEXT, MAX_NESTING_LEVEL))
+ apply_once (context, buffer, NO_CONTEXT, MAX_NESTING_LEVEL, 0))
ret = true;
else
_hb_buffer_next_glyph (buffer);
do
{
if ((~IN_MASK (buffer->in_pos) & mask) &&
- apply_once (context, buffer, NO_CONTEXT, MAX_NESTING_LEVEL))
+ apply_once (context, buffer, NO_CONTEXT, MAX_NESTING_LEVEL, 0))
ret = true;
else
buffer->in_pos--;
if (HB_UNLIKELY (context_length < 1))
return false;
- return l.apply_once (context, buffer, context_length, nesting_level_left);
+ return l.apply_once (context, buffer, context_length, nesting_level_left, apply_depth);
}
lookup_flag, \
property, \
(HB_DEBUG_APPLY ? apply_depth + 1 : 0)
-#define APPLY_ARG_INIT \
- context, \
- buffer, \
- context_length, \
- nesting_level_left, \
- lookup_flag, \
- property, \
- 1
typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const char *data);