File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libpdel / structs / type / structs_type_regex.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:25:53 2012 UTC (12 years, 4 months ago) by misho
Branches: libpdel, MAIN
CVS tags: v0_5_3, HEAD
libpdel


/*
 * 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 <archie@freebsd.org>
 */

#include <sys/types.h>

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <regex.h>

#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));
	}
}


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>