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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * octstr.h - Octet strings
  3.  *
  4.  * This header file declares an abstract data type, Octstr, for storing
  5.  * and manipulating octet strings: strings of arbitrary binary data in
  6.  * 8-bit bytes. Unlike C strings, they can contain the NUL byte ('').
  7.  * Conceptually, they consist of a sequence of octets (bytes) and the
  8.  * length of the sequence. There are various basic operations on octet
  9.  * strings: concatenating, comparing, printing, etc.
  10.  *
  11.  * Octet strings come in two flavors: mutable and immutable. Mutable
  12.  * octet strings are the normal kind and they can be modified and
  13.  * otherwise manipulated at will. Immutable octet strings are meant to
  14.  * be wrappers around a C string literal. They may not be modified, though
  15.  * they may be destroyed.
  16.  *
  17.  * Immutable octet strings are meant to simplify usage of octet strings
  18.  * together with C strings by reducing the number of octstr_* functions.
  19.  * For example, we need a function for searching one string within another.
  20.  * There needs to be different flavors of this: exact search, case-insensitive
  21.  * search, and a search limited to the first N octets of the strings.
  22.  * If in each of these one of the arguments may be either an octet string
  23.  * or a C string, the number of functions doubles. Thus, we use immutable
  24.  * strings instead:
  25.  *
  26.  * octstr_search(os, octstr_imm("foo"), 0)
  27.  *
  28.  * The above looks like a memory leak, but it is not. Each immutable
  29.  * octet string (i.e., with the same C string literal pointer) is really 
  30.  * created only the first time, and octstr_destroy won't destroy it,
  31.  * either. The immutable octet strings are destroyed automatically when
  32.  * the process ends.
  33.  *
  34.  * See comments below for explanations on individual functions. Note that
  35.  * all functions use gw_malloc and friends, so they won't return if the
  36.  * memory allocations fail. Octet string functions are thread safe, as
  37.  * long as they only one thread at a time operates on each octet string.
  38.  */
  39. #ifndef OCTSTR_H
  40. #define OCTSTR_H
  41. #include <stdio.h>
  42. #include <stdarg.h>
  43. #include "list.h"
  44. typedef struct Octstr Octstr;
  45. /*
  46.  * Initialize the Octstr subsystem.
  47.  */
  48. void octstr_init(void);
  49. /*
  50.  * Shut down the Octstr subsystem.
  51.  */
  52. void octstr_shutdown(void);
  53. /*
  54.  * Create an octet string from a NUL-terminated C string. Return pointer to
  55.  * the new object.
  56.  */
  57. Octstr *octstr_create_real(const char *cstr);
  58. #define octstr_create(cstr) gw_claim_area(octstr_create_real((cstr)))
  59. /*
  60.  * Create an octet string from arbitrary binary data. The length of the
  61.  * data is given, so it can contain NUL characters.
  62.  */
  63. Octstr *octstr_create_from_data_real(const char *data, long len);
  64. #define octstr_create_from_data(data, len)
  65.     gw_claim_area(octstr_create_from_data_real((data), (len)))
  66. /*
  67.  * Create an immutable octet string from a C string literal. The
  68.  * C string literal MUST NOT be modified and it MUST exist until the
  69.  * octet string is destroyed. The immutable octet string need not be
  70.  * destroyed - it is destroyed automatically when octstr_shutdown is
  71.  * called. In fact, octstr_destroy is a no-op for immutables.
  72.  */
  73. Octstr *octstr_imm(const char *cstr);
  74. /*
  75.  * Destroy an octet string, freeing all memory it uses. A NULL argument
  76.  * is ignored.
  77.  */
  78. void octstr_destroy_impl(Octstr *ostr, const char *file,
  79.  long line, const char *func);
  80. #define octstr_destroy(ostr)
  81. octstr_destroy_impl((ostr),__FILE__,__LINE__,__PRETTY_FUNCTION__)
  82. /*
  83.  * Destroy an octet string. Wrapper around octstr_destroy that is callable
  84.  * via list_destroy.
  85.  */
  86. void octstr_destroy_item(void *os);
  87. /*
  88.  * Return the length of (number of octets in) an object string.
  89.  */
  90. long octstr_len(Octstr *ostr);
  91. /*
  92.  * Create a new octet string by copying part of an existing one. Return 
  93.  * pointer to the new object. If `from' is after end of `ostr', an empty
  94.  * octet string is created. If `from+len' is after the end of `ostr', 
  95.  * `len' is reduced appropriately.
  96.  */
  97. Octstr *octstr_copy_real(Octstr *ostr, long from, long len);
  98. #define octstr_copy(ostr, from, len) 
  99.     gw_claim_area(octstr_copy_real((ostr), (from), (len)))
  100. /*
  101.  * Copy all of an octet string.
  102.  */
  103. Octstr *octstr_duplicate_real(Octstr *ostr);
  104. #define octstr_duplicate(ostr) gw_claim_area(octstr_duplicate_real((ostr)))
  105. /*
  106.  * Create a new octet string by catenating two existing ones. Return 
  107.  * pointer to the new object.
  108.  */
  109. Octstr *octstr_cat(Octstr *ostr1, Octstr *ostr2);
  110. /*
  111.  * Return value of octet at a given position in an octet string. The returned
  112.  * value has a range of 0..255 for valid positions, and -1 if `pos' is
  113.  * after the end of the octet string.
  114.  */
  115. int octstr_get_char(Octstr *ostr, long pos);
  116. /*
  117.  * Replace a single, existing character in an octet string. Operation cannot
  118.  * fail: if pos is not inside the string, the operation will silently be
  119.  * ignored.
  120.  */
  121. void octstr_set_char(Octstr *ostr, long pos, int ch);
  122. /*
  123.  * Copy bytes from octet string into array.
  124.  */
  125. void octstr_get_many_chars(char *buf, Octstr *ostr, long pos, long len);
  126. /*
  127.  * Return pointer to contents of octet string as a NUL-terminated C string.
  128.  * This is guaranteed to have a NUL character at the end, but it is not
  129.  * guaranteed (how could it?) to not contain NUL characters elsewhere.
  130.  * The pointer points directly into the internal buffer of the octet
  131.  * string, and must not be modified, and must not be used after any
  132.  * octstr_* function that modifies the octet string is called after this
  133.  * one. It is meant for printing debug messages easily.
  134.  *
  135.  * If the octet string is empty, an empty C string is returned, not NULL.
  136.  */
  137. char *octstr_get_cstr_real(Octstr *ostr, const char *file, long line,
  138.                   const char *func);
  139. #define octstr_get_cstr(ostr) 
  140.     (octstr_get_cstr_real(ostr, __FILE__, __LINE__, __func__))
  141. /*
  142.  * Append characters from printable hexadecimal format at the tail of 
  143.  * an octet string. "78797a" or "78797A" would be converted to "xyz"
  144.  * and then appended.
  145.  */
  146. void octstr_append_from_hex(Octstr *ostr, char *hex);
  147. /* Convert the octet string in-place to printable hexadecimal format.
  148.  * "xyz" would be converted to "78797a".  If the uppercase
  149.  * flag is set, 'A' through 'F' are used instead of 'a' through 'f'.
  150.  */
  151. void octstr_binary_to_hex(Octstr *ostr, int uppercase);
  152. /* Convert the octet string in-place from printable hexadecimal
  153.  * format to binary.  "78797a" or "78797A" would be converted to "xyz".
  154.  * If the string is not in the expected format, return -1 and leave
  155.  * the string unchanged.  If all was fine, return 0. */
  156. int octstr_hex_to_binary(Octstr *ostr);
  157. /* Base64-encode the octet string in-place, using the MIME base64
  158.  * encoding defined in RFC 2045.  Note that the result may be
  159.  * multi-line and is always terminated with a CR LF sequence.  */
  160. void octstr_binary_to_base64(Octstr *ostr);
  161. /* Base64-decode the octet string in-place, using the MIME base64
  162.  * encoding defined in RFC 2045. */
  163. void octstr_base64_to_binary(Octstr *ostr);
  164. /* Parse a number at position 'pos' in 'ostr', using the same rules as
  165.  * strtol uses regarding 'base'.  Skip leading whitespace.
  166.  * 
  167.  * Return the position of the first character after the number,
  168.  * or -1 if there was an error.  Return the length of the octet string
  169.  * if the number ran to the end of the string.
  170.  * 
  171.  * Assign the number itself to the location pointed to by 'number', if
  172.  * there was no error.
  173.  * 
  174.  * Possible errno values in case of an error:
  175.  *    ERANGE    The number did not fit in a long.
  176.  *    EINVAL    No digits of the appropriate base were found.
  177.  */
  178. long octstr_parse_long(long *number, Octstr *ostr, long pos, int base);
  179. /* Run the 'filter' function over each character in the specified range.
  180.  * Return 1 if the filter returned true for all characters, otherwise 0.
  181.  * The octet string is not changed.
  182.  * For example: ok = octstr_check_range(o, 1, 10, gw_isdigit);
  183.  */
  184. typedef int (*octstr_func_t)(int);
  185. int octstr_check_range(Octstr *ostr, long pos, long len, 
  186.                  octstr_func_t filter);
  187. /* Run the 'map' function over each character in the specified range,
  188.  * replacing each character with the return value of that function.
  189.  * For example: octstr_convert_range(o, 1, 10, tolower);
  190.  */
  191. void octstr_convert_range(Octstr *ostr, long pos, long len, 
  192.                  octstr_func_t map);
  193. /*
  194.  * Compare two octet strings, returning 0 if they are equal, negative if
  195.  * `ostr1' is less than `ostr2' (when compared octet-value by octet-value),
  196.  * and positive if greater.
  197.  */
  198. int octstr_compare(Octstr *ostr1, Octstr *ostr2);
  199. /*
  200.  * Like octstr_compare, except compares bytes without case sensitivity.
  201.  * Note that this probably doesn't work for Unicode, but should work
  202.  * for such 8-bit character sets as are supported by libc.
  203.  */
  204. int octstr_case_compare(Octstr *ostr1, Octstr *ostr2);
  205. /*
  206.  * as above, but comparing is done only up to n bytes
  207.  */
  208. int octstr_ncompare(Octstr *ostr1, Octstr *ostr2, long n);
  209. /*
  210.  * Same as octstr_compare, but compares the content of the octet string to 
  211.  * a C string.
  212.  */
  213. int octstr_str_compare(Octstr *ostr1, const char *str);
  214. /*
  215.  * Write contents of octet string to a file. Return -1 for error, 0 for OK.
  216.  */
  217. int octstr_print(FILE *f, Octstr *ostr);
  218. /*
  219.  * Search the character from octet string starting from position pos. Returns 
  220.  * the position (index) of the char in string, -1 if not found.
  221.  */
  222. int octstr_search_char(Octstr *ostr, int ch, long pos);
  223. /*
  224.  * Search for the octet string 'needle' in the octet string 'haystack'.
  225.  * Return the start position (index) of 'needle' in 'haystack'.
  226.  * Return -1 if not found.
  227.  */
  228. int octstr_search(Octstr *haystack, Octstr *needle, long pos);
  229. /*
  230.  * Like octstr_search, but ignores 8-bit byte case.
  231.  */
  232. int octstr_case_search(Octstr *haystack, Octstr *needle, long pos);
  233. /*
  234.  * Write contents of octet string to a file, in human readable form. 
  235.  * Return -1 for error, 0 for OK. Octets that are not printable characters
  236.  * are printed using C-style escape notation.
  237.  */
  238. int octstr_pretty_print(FILE *f, Octstr *ostr);
  239. /*
  240.  * Write contents of octet string to a socket. Return -1 for error, 0 for OK.
  241.  */
  242. int octstr_write_to_socket(int socket, Octstr *ostr);
  243. /*
  244.  * Write contents of octet string starting at 'from' to a
  245.  * non-blocking file descriptor.
  246.  * Return the number of octets written.  Return -1 for error.
  247.  * It is possible for this function to write only part of the octstr.
  248.  */
  249. long octstr_write_data(Octstr *ostr, int fd, long from);
  250. /*
  251.  * Read available data from socket and return it as an octstr.
  252.  * Block if no data is available.  If a lot of data is available,
  253.  * read only up to an internal limit.
  254.  * Return -1 for error.
  255.  */
  256. int octstr_append_from_socket(Octstr *ostr, int socket);
  257. /*
  258.  * Insert one octet string into another. `pos' gives the position
  259.  * in `ostr1' where `ostr2' should be inserted.
  260.  */
  261. void octstr_insert_impl (Octstr *ostr1, Octstr *ostr2, long pos,
  262.  const char *file, long line, const char *func);
  263. #define octstr_insert(ostr1,ostr2,pos)
  264. octstr_insert_impl ((ostr1),(ostr2),(pos),__FILE__,__LINE__,__PRETTY_FUNCTION__)
  265. /*
  266.  * Insert characters from C array into an octet string. `pos' 
  267.  * gives the position in `ostr' where `data' should be inserted. `len'
  268.  * gives the number of characters in `data'.
  269.  * If the given `pos' is greater than the length of the input octet string,
  270.  * it is set to that length, resulting in an append.
  271.  */
  272. void octstr_insert_data(Octstr *ostr, long pos, const char *data, long len);
  273. /*
  274.  * Append characters from C array at the tail of an octet string.
  275.  */
  276. void octstr_append_data(Octstr *ostr, const char *data, long len);
  277. /*
  278.  * Append a second octstr to the first.
  279.  */
  280. void octstr_append_impl(Octstr *ostr1, Octstr *ostr2,
  281. const char *file, long line, const char *func);
  282. #define octstr_append(ostr1,ostr2)
  283. octstr_append_impl ((ostr1),(ostr2),__FILE__,__LINE__,__PRETTY_FUNCTION__)
  284. /*
  285.  * Append a normal C string at the tail of an octet string.
  286.  */
  287. void octstr_append_cstr(Octstr *ostr, const char *cstr);
  288. /*
  289.  * Append a single character at the tail of an octet string.
  290.  */
  291. void octstr_append_char(Octstr *ostr, int ch);
  292. /*
  293.  * Truncate octet string at `new_len'. If new_len is same or more
  294.  * than current, do nothing.
  295.  */
  296. void octstr_truncate(Octstr *ostr, int new_len);
  297. /*
  298.  * Strip white space from start and end of a octet string.
  299.  */
  300. void octstr_strip_blanks(Octstr *ostr);
  301. /*
  302.  * Strip non-alphanums from start and end of a octet string.
  303.  */
  304. void octstr_strip_nonalphanums(Octstr *ostr);
  305. /*
  306.  * Shrink consecutive white space characters into one space.
  307.  */
  308. void octstr_shrink_blanks(Octstr *ostr);
  309. /*
  310.  * Delete part of an octet string.
  311.  */
  312. void octstr_delete(Octstr *ostr1, long pos, long len);
  313. /*
  314.  * Read the contents of a named file to an octet string. Return pointer to
  315.  * octet string.
  316.  */
  317. Octstr *octstr_read_file(const char *filename);
  318. /*
  319.  * Read the contents of a file descriptor pipe to an octet string. 
  320.  * Return pointer to octet string.
  321.  */
  322. Octstr *octstr_read_pipe(FILE *f);
  323. /*
  324.  * Split an octet string into words at whitespace, and return a list
  325.  * containing the new octet strings.
  326.  */
  327. List *octstr_split_words(Octstr *ostr);
  328. /*
  329.  * Split an octet string into substrings at every occurence of `sep'.
  330.  * Return List with the substrings.
  331.  */
  332. List *octstr_split(Octstr *os, Octstr *sep);
  333. /*
  334.  * Compare two octet strings in a manner suitable for list_search.
  335.  */
  336. int octstr_item_match(void *item, void *pattern);
  337. /*
  338.  * Print debugging information about octet string.
  339.  */
  340. void octstr_dump(Octstr *ostr, int level);
  341. /*
  342.  * Write the contents of an octet string to the debug log.
  343.  * Keep it on one line if the octet string is short and printable,
  344.  * otherwise use a hex dump.
  345.  */
  346. void octstr_dump_short(Octstr *ostr, int level, const char *name);
  347. /*
  348.  * decode url-encoded octstr in-place.
  349.  * Return 0 if all went fine, or -1 if there was some garbage
  350.  */
  351. int octstr_url_decode(Octstr *ostr);
  352. /*
  353.  * URL encode the argument string in place.
  354.  */
  355. void octstr_url_encode(Octstr *ostr);
  356. /*
  357.  * Treat the octstr as an unsigned array of bits, most significant bit
  358.  * first, and return the indicated bit range as an integer.  numbits
  359.  * must not be larger than 32.  Bits beyond the end of the string will
  360.  * be read as 0.
  361.  */
  362. long octstr_get_bits(Octstr *ostr, long bitpos, int numbits);
  363. /*
  364.  * Treat the octstr as an unsigned array of bits, most significant bit
  365.  * first, and set the indicated bit range to the given value.  numbits
  366.  * must not be larger than 32.  The value must fit in that number of bits.
  367.  * The string will be extended with 0-valued octets as necessary to hold
  368.  * the indicated bit range.
  369.  */
  370. void octstr_set_bits(Octstr *ostr, long bitpos, int numbits, 
  371.                unsigned long value);
  372. /* 
  373.  * Encode value in WSP's uintvar format, and append it to the octstr
  374.  */
  375. void octstr_append_uintvar(Octstr *ostr, unsigned long value);
  376. /* 
  377.  * Decode a value in WSP's uintvar format at position pos of the octstr,
  378.  * and put the result in *value.  Return the position after the uintvar.
  379.  * Return -1 if there is not a valid uintvar at pos.
  380.  */
  381. long octstr_extract_uintvar(Octstr *ostr, unsigned long *value, long pos);
  382. /*
  383.  * Append the decimal representation of the given value to ostr 
  384.  */
  385. void octstr_append_decimal(Octstr *ostr, long value);
  386. /*
  387.  * Create a new octet string based on a printf-like (but not identical)
  388.  * format string, and a list of other arguments. The format string is
  389.  * a C string for convenience, but this may change later.
  390.  *
  391.  * The syntax for the format string is as follows:
  392.  *
  393.  * % [-] [0] [width] [. prec] [type] conversion
  394.  *
  395.  * where [] denotes optional parts and the various parts have the
  396.  * following meanings:
  397.  *
  398.  * - add padding to the right, instead of the left of the field
  399.  *
  400.  * 0 pad with zeroes, not spaces
  401.  *
  402.  * width minimum output width; non-negative integer or '*', indicating
  403.  * that the next argument is an int and gives the width
  404.  *
  405.  * . a dot to indicate that precision follows
  406.  *
  407.  * prec precision: maximum length of strings, maximum number of
  408.  * decimals for floating point numbers; non-negative integer
  409.  * or '*' indicating that the next argument is an int and
  410.  * gives the precision
  411.  *
  412.  * type type of integer argument: either h (for short int) or 
  413.  * l (for long int); may only be used with conversion 'd'
  414.  *
  415.  * conversion
  416.  * how the field is to be converted, also implicitly defines
  417.  * the type of the next argument; one of
  418.  *
  419.  * d int (unless type says otherwise)
  420.  * output as a decimal integer
  421.  *
  422.  * e, f, g double
  423.  * output in various formats of floating
  424.  * point, see printf(3) for details
  425.  *
  426.  * s char *
  427.  * output as character string
  428.  *
  429.  * S Octstr *
  430.  * output as character string, except ''
  431.  * inside the string is included in the
  432.  * output
  433.  *
  434.  *                      E       Octstr *
  435.  *                              output as character string, except that
  436.  *                              contents are URL-encoded when need to. Note
  437.  *                              that trunctae is done afterwards and can
  438.  *                              cut escape '%EE' in half
  439.  */
  440. Octstr *octstr_format(const char *fmt, ...);
  441. /*
  442.  * Like octstr_format, but takes the argument list as a va_list.
  443.  */
  444. Octstr *octstr_format_valist(const char *fmt, va_list args);
  445. /*
  446.  * Like octstr_format, but appends output to an existing octet
  447.  * string, instead of creating a new one.
  448.  */
  449. void octstr_format_append(Octstr *os, const char *fmt, ...);
  450. /*
  451.  * Compute a hash key value for an octet string by adding all the 
  452.  * octets together.
  453.  */
  454. unsigned long octstr_hash_key(Octstr *ostr);
  455. /*
  456.  * return an Octstr encoded in chrset named tocode created from the data
  457.  * in the Octstr orig that is encoded in the charset fromcode.
  458.  */
  459. int octstr_recode (Octstr *tocode, Octstr *fromcode, Octstr *orig);
  460. #endif