17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*	Copyright (c) 1988 AT&T	*/
237c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
247c478bd9Sstevel@tonic-gate 
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate /*
277c478bd9Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
287c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
297c478bd9Sstevel@tonic-gate  */
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate /*LINTLIBRARY*/
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #include <sys/types.h>
347c478bd9Sstevel@tonic-gate #include <stdlib.h>
357c478bd9Sstevel@tonic-gate #include "utility.h"
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate /*
387c478bd9Sstevel@tonic-gate  *	TYPE_REGEXP standard type
397c478bd9Sstevel@tonic-gate  *
407c478bd9Sstevel@tonic-gate  *	usage:
417c478bd9Sstevel@tonic-gate  *		set_field_type(f, TYPE_REGEXP, expression);
427c478bd9Sstevel@tonic-gate  *
43*bbf21555SRichard Lowe  *		char * expression;	regular expression regcmp(3C)
447c478bd9Sstevel@tonic-gate  */
457c478bd9Sstevel@tonic-gate extern char *libform_regcmp(char *, char *);
467c478bd9Sstevel@tonic-gate extern char *libform_regex(char *, char *, char *);
477c478bd9Sstevel@tonic-gate static char *make_rexp(va_list *);
487c478bd9Sstevel@tonic-gate static char *copy_rexp(char *);
497c478bd9Sstevel@tonic-gate static void free_rexp(char *);
507c478bd9Sstevel@tonic-gate static int fcheck_rexp(FIELD *, char *);
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate static FIELDTYPE typeREGEXP =
537c478bd9Sstevel@tonic-gate {
547c478bd9Sstevel@tonic-gate 				ARGS,			/* status	*/
557c478bd9Sstevel@tonic-gate 				1,			/* ref		*/
567c478bd9Sstevel@tonic-gate 				(FIELDTYPE *) 0,	/* left		*/
577c478bd9Sstevel@tonic-gate 				(FIELDTYPE *) 0,	/* right	*/
587c478bd9Sstevel@tonic-gate 				make_rexp,		/* makearg	*/
597c478bd9Sstevel@tonic-gate 				copy_rexp,		/* copyarg	*/
607c478bd9Sstevel@tonic-gate 				free_rexp,		/* freearg	*/
617c478bd9Sstevel@tonic-gate 				fcheck_rexp,		/* fcheck	*/
627c478bd9Sstevel@tonic-gate 				(PTF_int) 0,		/* ccheck	*/
637c478bd9Sstevel@tonic-gate 				(PTF_int) 0,		/* next		*/
647c478bd9Sstevel@tonic-gate 				(PTF_int) 0,		/* prev		*/
657c478bd9Sstevel@tonic-gate };
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate FIELDTYPE * TYPE_REGEXP = &typeREGEXP;
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate static char *
make_rexp(va_list * ap)707c478bd9Sstevel@tonic-gate make_rexp(va_list *ap)
717c478bd9Sstevel@tonic-gate {
727c478bd9Sstevel@tonic-gate 	return (libform_regcmp(va_arg(*ap, char *), NULL));
737c478bd9Sstevel@tonic-gate 					/* (...)$n will dump core */
747c478bd9Sstevel@tonic-gate }
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate static char *
copy_rexp(char * arg)777c478bd9Sstevel@tonic-gate copy_rexp(char *arg)
787c478bd9Sstevel@tonic-gate {
797c478bd9Sstevel@tonic-gate 	char *rexp;
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate 	if (arrayAlloc(rexp, (strlen(arg) + 1), char))
827c478bd9Sstevel@tonic-gate 		(void) strcpy(rexp, arg);
837c478bd9Sstevel@tonic-gate 	return (rexp);
847c478bd9Sstevel@tonic-gate }
857c478bd9Sstevel@tonic-gate 
867c478bd9Sstevel@tonic-gate static void
free_rexp(char * arg)877c478bd9Sstevel@tonic-gate free_rexp(char *arg)
887c478bd9Sstevel@tonic-gate {
897c478bd9Sstevel@tonic-gate 	Free(arg);
907c478bd9Sstevel@tonic-gate }
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate static int
fcheck_rexp(FIELD * f,char * arg)937c478bd9Sstevel@tonic-gate fcheck_rexp(FIELD *f, char *arg)
947c478bd9Sstevel@tonic-gate {
957c478bd9Sstevel@tonic-gate 	return (libform_regex(arg, field_buffer(f, 0), NULL) ? TRUE : FALSE);
967c478bd9Sstevel@tonic-gate }
97