Branch: Tag:

2001-06-20

2001-06-20 23:27:24 by Martin Stjernholm <mast@lysator.liu.se>

Various p-code fixes, especially wrt error handling. The known bug with
compiled-in rxml backtraces is now fixed.

Rev: server/etc/modules/RXML.pmod/PEnt.pike:1.22
Rev: server/etc/modules/RXML.pmod/PXml.pike:1.58
Rev: server/etc/modules/RXML.pmod/module.pmod:1.169
Rev: server/etc/modules/RXML.pmod/utils.pmod:1.25

7:   //!   //! Created 2000-01-21 by Martin Stjernholm   //! - //! $Id: utils.pmod,v 1.24 2001/06/18 15:19:44 mast Exp $ + //! $Id: utils.pmod,v 1.25 2001/06/20 23:27:24 mast Exp $      constant short_format_length = 40;   
90:    return res;   }    - final int(1..1)|string|array free_text_error (object/*(RMXL.PXml)*/ p, string str) - { -  sscanf (str, "%[ \t\n\r]", string ws); -  if (str != ws) -  RXML.parse_error ("Free text %s is not allowed in context of type %s.\n", -  format_short (String.trim_all_whites (str)), p->type->name); -  return ({}); - } -  +    final int(1..1)|string|array unknown_tag_error (object/*(RMXL.PXml)*/ p, string str)   { -  RXML.parse_error ("Unknown tag %s is not allowed in context of type %s.\n", -  format_short (p->tag_name()), p->type->name); +  p->context->handle_exception ( +  catch (RXML.parse_error ( +  "Unknown tag %s is not allowed in context of type %s.\n", +  format_short (p->tag_name()), p->type->name)), p, 1);    return ({});   }      final int(1..1)|string|array unknown_pi_tag_error (object/*(RMXL.PXml)*/ p, string str)   {    sscanf (str, "%[^ \t\n\r]", str); -  RXML.parse_error ( +  p->context->handle_exception ( +  catch (RXML.parse_error (    "Unknown processing instruction %s not allowed in context of type %s.\n", -  format_short ("<" + p->tag_name() + str), p->type->name); +  format_short ("<" + p->tag_name() + str), p->type->name)), p, 1);    return ({});   }      final int(1..1)|string|array invalid_cdata_error (object/*(RXML.PXml)*/ p, string str)   { -  RXML.parse_error ("CDATA text %O is not allowed in context of type %s.\n", -  format_short (str), p->type->name); +  p->context->handle_exception ( +  catch (RXML.parse_error ( +  "CDATA text %O is not allowed in context of type %s.\n", +  format_short (str), p->type->name)), p, 1);    return ({});   }      final int(1..1)|string|array output_error_cb (object/*(RMXL.PXml)*/ p, string str)   { -  if (p->errmsgs) str = p->errmsgs + str, p->errmsgs = 0; -  if (p->type->free_text) p->_set_data_callback (0); -  else p->_set_data_callback (free_text_error); +  p->output_errors();    return ({str});   }   
136:   final int(1..1)|string|array p_xml_comment_cb (object/*(RXML.PXml)*/ p, string str)   // FIXME: This is a kludge until quote tags are handled like other tags.   { -  if (p->type->handle_literals) p->handle_literal(); -  else if (p->p_code) p->p_code_literal(); +  p->drain_output();    string name = p->parse_tag_name (str);    if (sizeof (name)) {    name = p->tag_name() + name;
150:    return tdef (p, p->parse_tag_args (str));    }    else if (p->containers()[name]) -  RXML.parse_error ("Sorry, can't handle containers beginning with " + -  p->tag_name() + ".\n"); +  p->context->handle_exception ( +  catch (RXML.parse_error ( +  "Sorry, can't handle containers beginning with %s.\n", +  p->tag_name())), p, 1);    }    return p->type->free_text ? 0 : ({});   }
180:    else    if (entity[0] == ':') str = entity[1..];    else if (has_value (entity, ".")) { -  if (type->handle_literals) p->handle_literal(); -  else if (p->p_code) p->p_code_literal(); +  p->drain_output();    mixed value = p->handle_var (    p,    entity,
189:    // safeguard against splicing in things like "nice><evil    // stuff='...'"?    p->html_context() == "splice_arg" ? RXML.t_any_text : type); -  if (value != RXML.nil) { -  if (type->free_text && !p->p_code) return ({value}); -  p->add_value (value); -  } +  if (value != RXML.nil) p->add_value (value);    return ({});    } -  if (!type->free_text) -  RXML.parse_error ("Unknown entity \"&%s;\" not allowed context of type %s.\n", -  entity, type->name); +     return ({str});   }   
208:    if (sizeof (entity) && entity[0] != '#')    if (entity[0] == ':') str = entity[1..];    else if (has_value (entity, ".")) { -  if (type->handle_literals) p->handle_literal(); -  else if (p->p_code) p->p_code_literal(); +  p->drain_output();    mixed value = p->handle_var (    p,    entity,
217:    // safeguard against splicing in things like "nice><evil    // stuff='...'"?    p->html_context() == "splice_arg" ? RXML.t_any_text : type); -  if (value != RXML.nil) { -  if (type->free_text && !p->p_code) return ({value}); -  p->add_value (value); -  } +  if (value != RXML.nil) p->add_value (value);    return ({});    } -  if (!type->free_text) -  RXML.parse_error ("Unknown entity \"&%s;\" not allowed in context of type %s.\n", -  entity, type->name); +     return ({str});   }