parse.h
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:4k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * parse.h - functions for octet-by-octet parsing of an octstr
  3.  *
  4.  * Interface to keep track of position in an octstr, and remember
  5.  * error conditions so that they can be checked after a bunch of
  6.  * calls.  Also allows temporary clipping of the string, so that
  7.  * parsing doesn't go past a boundary until it's explicitly allowed
  8.  * to.  This helps parse strings containing length-defined chunks.
  9.  *
  10.  * The main use of this interface is to simplify code that does
  11.  * this kind of parsing, so that it can pass around a single
  12.  * ParseContext value instead of an octstr and one or more offset
  13.  * and length parameters.
  14.  *
  15.  * Note: The octstr involved MUST NOT change during parsing.
  16.  *
  17.  * Richard Braakman
  18.  */
  19. #ifndef PARSE_H
  20. #define PARSE_H
  21. typedef struct context ParseContext;
  22. /*
  23.  * Return a ParseContext object for this octstr, with parsing starting
  24.  * at position 0 and the limit at the end of the string.
  25.  */
  26. ParseContext *parse_context_create(Octstr *str);
  27. /*
  28.  * Destroy a ParseContext object.  Note that this does not free the string
  29.  * that was parsed.
  30.  */
  31. void parse_context_destroy(ParseContext *context);
  32. /*
  33.  * Return -1 if any error has occurred during parsing, otherwise 0.
  34.  */
  35. int parse_error(ParseContext *context);
  36. /*
  37.  * Clear the error flag for the next call to parse_error.
  38.  */
  39. void parse_clear_error(ParseContext *context);
  40. /*
  41.  * Set the error flag.
  42.  */
  43. void parse_set_error(ParseContext *context);
  44. /*
  45.  * Set a new "end" of the string, for parsing purposes, at length
  46.  * octets from the current position.  Return 0 if it's okay.
  47.  * If it doesn't fit in the current limit, don't do anything and
  48.  * return -1.
  49.  */
  50. int parse_limit(ParseContext *context, long length);
  51. /*
  52.  * Restore the previous "end" of the string.  Limits can be stacked
  53.  * as deeply as needed.  The original limit (end-of-string) can
  54.  * not be popped.  Return -1 and set the error flag if there was
  55.  * nothing to pop, otherwise return 0.
  56.  */
  57. int parse_pop_limit(ParseContext *context);
  58. /*
  59.  * Return the number of octets between the current position and
  60.  * the current limit.
  61.  */
  62. long parse_octets_left(ParseContext *context);
  63. /*
  64.  * Skip count octets.  If that would go past the limit, return -1,
  65.  * skip to the limit, and set the error flag.  Otherwise return 0.
  66.  */
  67. int parse_skip(ParseContext *context, long count);
  68. /*
  69.  * Skip to the current limit.  Cannot fail.
  70.  */
  71. void parse_skip_to_limit(ParseContext *context);
  72. /*
  73.  * Set offset to new position.  If that would go past the limit, return
  74.  * -1, skip to the limit, and set the error flag.  Otherwise return 0.
  75.  */
  76. int parse_skip_to(ParseContext *context, long pos);
  77. /*
  78.  * Return the next octet, but do not skip over it.
  79.  * If already at the limit, return -1 and set the error flag.
  80.  */
  81. int parse_peek_char(ParseContext *context);
  82. /*
  83.  * Return the next octet and skip one position forward.
  84.  * If already at the limit, return -1 and set the error flag.
  85.  */
  86. int parse_get_char(ParseContext *context);
  87. /* 
  88.  * Return "length" octets starting at current position, and skip
  89.  * that many octets forward.  If that would go over the limit,
  90.  * return NULL, do not skip, and set the error flag.
  91.  */
  92. Octstr *parse_get_octets(ParseContext *context, long length);
  93. /*
  94.  * Return the value of an uintvar-encoded integer at current
  95.  * position, then skip over it.  If there's an error in the
  96.  * encoding, or if it would go past the limit, then return 0,
  97.  * do not skip, and set the error flag.  Since 0 is a valid
  98.  * uintvar value, the error flag is only way to detect this error.
  99.  */
  100. unsigned long parse_get_uintvar(ParseContext *context);
  101. /*
  102.  * Look for a NUL-terminated string starting at the current offset,
  103.  * and return it (without the NUL) as an Octstr.  Skip forward past
  104.  * the NUL.  If there is no NUL, return NULL and set the error flag.
  105.  */
  106. Octstr *parse_get_nul_string(ParseContext *context);
  107. /*
  108.  * Return unparsed content. This should be used only after all 
  109.  * headers are parsed (and the headers and content are stored in
  110.  * same octstr).
  111.  */
  112.  
  113. Octstr *parse_get_rest(ParseContext *context);
  114. #endif