/* * Copyright (c) 2001-2002 Packet Design, LLC. * All rights reserved. * * Subject to the following obligations and disclaimer of warranty, * use and redistribution of this software, in source or object code * forms, with or without modifications are expressly permitted by * Packet Design; provided, however, that: * * (i) Any and all reproductions of the source or object code * must include the copyright notice above and the following * disclaimer of warranties; and * (ii) No rights are granted, in any manner or form, to use * Packet Design trademarks, including the mark "PACKET DESIGN" * on advertising, endorsements, or otherwise except as such * appears in the above copyright notice or in the software. * * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * OR NON-INFRINGEMENT. PACKET DESIGN DOES NOT WARRANT, GUARANTEE, * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, * RELIABILITY OR OTHERWISE. IN NO EVENT SHALL PACKET DESIGN BE * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * * Author: Archie Cobbs */ #include #include #include #include #include #include #include #include "structs/structs.h" #include "structs/type/array.h" #include "structs/type/string.h" #include "structs/type/regex.h" #include "util/typed_mem.h" /* Pre-defined types */ const struct structs_type structs_type_regex = STRUCTS_REGEX_TYPE(STRUCTS_REGEX_MTYPE, REG_EXTENDED); const struct structs_type structs_type_regex_icase = STRUCTS_REGEX_TYPE(STRUCTS_REGEX_MTYPE, REG_EXTENDED | REG_ICASE); int structs_regex_equal(const struct structs_type *type, const void *v1, const void *v2) { const struct structs_regex *const r1 = v1; const struct structs_regex *const r2 = v2; if (r1->pat == NULL) return (r2->pat == NULL); if (r2->pat == NULL) return (0); return (strcmp(r1->pat, r2->pat) == 0); } char * structs_regex_ascify(const struct structs_type *type, const char *mtype, const void *data) { const struct structs_regex *const r = data; return (STRDUP(mtype, (r->pat != NULL) ? r->pat : "")); } int structs_regex_binify(const struct structs_type *type, const char *ascii, void *data, char *ebuf, size_t emax) { struct structs_regex *const r = data; const char *mtype = type->args[0].s; const int flags = type->args[1].i; int errno_save; int err; /* Empty string? */ if (*ascii == '\0') { memset(r, 0, sizeof(*r)); return (0); } /* Compile pattern */ if ((err = regcomp(&r->reg, ascii, flags)) != 0) { regerror(err, &r->reg, ebuf, emax); switch (err) { case REG_ESPACE: errno = ENOMEM; break; default: errno = EINVAL; break; } return (-1); } /* Save a copy of the pattern string */ if ((r->pat = STRDUP(mtype, ascii)) == NULL) { errno_save = errno; regfree(&r->reg); errno = errno_save; return (-1); } /* OK */ return (0); } void structs_regex_free(const struct structs_type *type, void *data) { const char *mtype = type->args[0].s; struct structs_regex *const r = data; if (r->pat != NULL) { FREE(mtype, (char *)r->pat); regfree(&r->reg); memset(r, 0, sizeof(*r)); } }