re.c
上传用户:hxtd_72
上传日期:2007-06-06
资源大小:64k
文件大小:3k
源码类别:

驱动编程

开发平台:

C/C++

  1. /*
  2.     re.c.
  3.     Regular expression processing for ksymoops.
  4.     Copyright 1999 Keith Owens <kaos@ocs.com.au>.
  5.     Released under the GNU Public Licence, Version 2.
  6.  */
  7. #include "ksymoops.h"
  8. #include <malloc.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. /* Compile a regular expression */
  12. void re_compile(regex_t *preg, const char *regex, int cflags,
  13. regmatch_t **pmatch)
  14. {
  15.     int i, l;
  16.     char *p;
  17.     static char const procname[] = "re_compile";
  18.     DEBUG_S(1, "'%s'", regex);
  19.     if ((i = regcomp(preg, regex, cflags))) {
  20. l = regerror(i, preg, NULL, 0);
  21. ++l;    /* doc is ambiguous, be safe */
  22. p = malloc(l);
  23. if (!p)
  24.     malloc_error("regerror text");
  25. regerror(i, preg, p, l);
  26. FATAL("on '%s' - %s", regex, p);
  27.     }
  28.     DEBUG_E(1, " %d sub expression(s)", preg->re_nsub);
  29.     /* [0] is entire match, [1] is first substring */
  30.     *pmatch = malloc((preg->re_nsub+1)*sizeof(**pmatch));
  31.     if (!*pmatch)
  32. malloc_error("pmatch");
  33. }
  34. /* Compile common regular expressions */
  35. void re_compile_common(void)
  36. {
  37.     /* nm: address, type, symbol, optional [module] */
  38.     RE_COMPILE(&re_nm,
  39. "^([0-9a-fA-F]{4,}) +([^ ]) +([^ ]+)( +\[([^ ]+)\])?$",
  40. REG_NEWLINE|REG_EXTENDED,
  41. &re_nm_pmatch);
  42.     /* bracketed address preceded by optional white space */
  43.     RE_COMPILE(&re_bracketed_address,
  44. "^ *" BRACKETED_ADDRESS,
  45. REG_NEWLINE|REG_EXTENDED,
  46. &re_bracketed_address_pmatch);
  47.     /* reverse bracketed address preceded by optional white space */
  48.     RE_COMPILE(&re_revbracketed_address,
  49. "^ *" REVBRACKETED_ADDRESS,
  50. REG_NEWLINE|REG_EXTENDED,
  51. &re_revbracketed_address_pmatch);
  52.     /* unbracketed address preceded by optional white space */
  53.     RE_COMPILE(&re_unbracketed_address,
  54. "^ *" UNBRACKETED_ADDRESS,
  55. REG_NEWLINE|REG_EXTENDED,
  56. &re_unbracketed_address_pmatch);
  57. }
  58. /* Split text into the matching re substrings - Perl is so much easier :).
  59.  * Each element of *string is set to a malloced copy of the substring or
  60.  * NULL if the substring did not match (undef).  A zero length substring match
  61.  * is represented by a zero length **string.
  62.  */
  63. void re_strings(regex_t *preg, const char *text, regmatch_t *pmatch,
  64. char ***string)
  65. {
  66.     int i;
  67.     static char const procname[] = "re_strings";
  68.     if (!*string) {
  69. *string = malloc((preg->re_nsub+1)*sizeof(**string));
  70. if (!*string)
  71.     malloc_error("re_strings base");
  72. for (i = 0; i < preg->re_nsub+1; ++i)
  73.     (*string)[i] = NULL;
  74.     }
  75.     for (i = 0; i < preg->re_nsub+1; ++i) {
  76. DEBUG_S(5, "%d offsets %d %d", i, pmatch[i].rm_so, pmatch[i].rm_eo);
  77. if (pmatch[i].rm_so == -1) {
  78.     /* no match for this sub expression */
  79.     free((*string)[i]);
  80.     (*string)[i] = NULL;
  81.     DEBUG_E(5, "%s", " (undef)");
  82. }
  83. else {
  84.     int l = pmatch[i].rm_eo - pmatch[i].rm_so + 1;
  85.     char *p;
  86.     p = malloc(l);
  87.     if (!p)
  88. malloc_error("re_strings");
  89.     strncpy(p, text+pmatch[i].rm_so, l-1);
  90.     *(p+l-1) = '';
  91.     (*string)[i] = p;
  92.     DEBUG_E(5, " '%s'", p);
  93. }
  94.     }
  95. }
  96. /* Free the matching re substrings */
  97. void re_strings_free(const regex_t *preg, char ***string)
  98. {
  99.     if (*string) {
  100. int i;
  101. for (i = 0; i < preg->re_nsub+1; ++i)
  102.     free((*string)[i]);
  103. free(*string);
  104. *string = NULL;
  105.     }
  106. }
  107. /* Check that there are enough strings for an re */
  108. void re_string_check(int need, int available, const char *msg)
  109. {
  110.     static char const procname[] = "re_string_check";
  111.     if (need > available)
  112. FATAL("not enough re_strings in %s.  Need %d, available %d",
  113.     msg, need, available);
  114. }