conv.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 1990 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.13 */
/* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
#include "string.h"
#include "errno.h"
#include "stdlib.h"
#include "regexpr.h"
#include "lp.h"
#include "filters.h"
static char *keyword_list[] = {
PARM_INPUT,
PARM_OUTPUT,
PARM_TERM,
PARM_PRINTER,
PARM_CPI,
PARM_LPI,
PARM_LENGTH,
PARM_WIDTH,
PARM_PAGES,
PARM_CHARSET,
PARM_FORM,
PARM_COPIES,
PARM_MODES,
0
};
#if defined(__STDC__)
static char * q_strchr ( char * , char );
static char * q_strdup ( char * );
#else
static char *q_strchr(),
*q_strdup();
#endif
/**
** s_to_filtertype() - CONVERT (char *) TO (FILTERTYPE)
**/
FILTERTYPE
#if defined(__STDC__)
s_to_filtertype (
char * str
)
#else
s_to_filtertype (str)
char *str;
#endif
{
/*
* The default type, if none is given, is ``slow''.
*/
if (STREQU(str, FL_FAST))
return (fl_fast);
else
return (fl_slow);
}
/**
** s_to_type() - CONVERT (char *) TO (TYPE)
**/
TYPE
#if defined(__STDC__)
s_to_type (
char * str
)
#else
s_to_type (str)
register char *str;
#endif
{
TYPE ret;
if ((ret.name = Strdup(str)))
ret.info = isterminfo(str);
return (ret);
}
/**
** s_to_template() - CONVERT (char *) TO (TEMPLATE)
**/
TEMPLATE
#if defined(__STDC__)
s_to_template (
char * str
)
#else
s_to_template (str)
register char *str;
#endif
{
TEMPLATE ret;
register char *p,
c;
if (!*(str += strspn(str, " "))) {
lp_errno = LP_ETEMPLATE;
ret.keyword = 0;
goto Done;
}
if (!(p = strchr(str, ' '))) {
lp_errno = LP_EPATTERN;
ret.keyword = 0;
goto Done;
}
c = *p;
*p = 0;
ret.keyword = Strdup(str);
*p = c;
if (!ret.keyword) {
lp_errno = LP_ENOMEM;
goto Done;
}
if (!searchlist(ret.keyword, keyword_list)) {
lp_errno = LP_EKEYWORD;
ret.keyword = 0;
goto Done;
}
str = p + strspn(p, " ");
if (!(p = q_strchr(str, '='))) {
lp_errno = LP_ERESULT;
ret.keyword = 0;
goto Done;
}
while (p[-1] == ' ' && p > str)
p--;
c = *p;
*p = 0;
ret.pattern = q_strdup(str);
*p = c;
if (!ret.pattern) {
lp_errno = LP_ENOMEM;
ret.keyword = 0;
goto Done;
}
if (!*ret.pattern) {
lp_errno = LP_EPATTERN;
ret.keyword = 0;
goto Done;
}
if (!(ret.re = compile(ret.pattern, (char *)0, (char *)0))) {
lp_errno = LP_EREGEX;
ret.keyword = 0;
goto Done;
}
ret.nbra = nbra;
if (!*(str = p + strspn(p, " ="))) {
lp_errno = LP_ERESULT;
ret.keyword = 0;
goto Done;
}
ret.result = q_strdup(str);
if (!ret.result) {
lp_errno = LP_ENOMEM;
ret.keyword = 0;
}
Done: return (ret);
}
/**
** sl_to_typel() - CONVERT (char **) LIST TO (TYPE *) LIST
**/
TYPE *
#if defined(__STDC__)
sl_to_typel (
char ** src
)
#else
sl_to_typel (src)
char **src;
#endif
{
register TYPE *dst;
register int nitems,
n;
if (!src || !*src)
return (0);
for (nitems = 0; src[nitems]; nitems++)
;
if (!(dst = (TYPE *)Malloc((nitems + 1) * sizeof(TYPE)))) {
errno = ENOMEM;
return (0);
}
for (n = 0; n < nitems; n++)
dst[n] = s_to_type(src[n]);
dst[nitems].name = 0;
return (dst);
}
/**
** sl_to_templatel() - DUPLICATE A (char **) LIST AS (TEMPLATE *) LIST
**/
TEMPLATE *
#if defined(__STDC__)
sl_to_templatel (
char ** src
)
#else
sl_to_templatel (src)
register char **src;
#endif
{
register TEMPLATE *dst;
register int nitems,
n;
if (!src || !*src)
return (0);
for (nitems = 0; src[nitems]; nitems++)
;
if (!(dst = (TEMPLATE *)Malloc((nitems + 1) * sizeof(TEMPLATE)))){
errno = ENOMEM;
return (0);
}
for (n = 0; n < nitems; n++) {
dst[n] = s_to_template(src[n]);
if (dst[n].keyword == 0) {
freetempl (dst);
return (0);
}
}
dst[nitems].keyword = 0;
return (dst);
}
/**
** type_to_s() - CONVERT (TYPE) TO (char *)
**/
char *
#if defined(__STDC__)
type_to_s (
TYPE t
)
#else
type_to_s (t)
TYPE t;
#endif
{
return (Strdup(t.name));
}
/**
** template_to_s() - CONVERT (TEMPLATE) TO (char *)
**/
char *
#if defined(__STDC__)
template_to_s (
TEMPLATE t
)
#else
template_to_s (t)
TEMPLATE t;
#endif
{
register char *ret,
*p,
*r;
register size_t len;
len = strlen(t.keyword) + 1;
for (p = t.pattern; *p; p++) {
if (*p == '=')
len++;
len++;
}
len += 3 + strlen(t.result);
ret = Malloc(len + 1);
if (!ret) {
errno = ENOMEM;
return (0);
}
r = ret;
for (p = t.keyword; *p; )
*r++ = *p++;
*r++ = ' ';
for (p = t.pattern; *p; ) {
if (*p == '=')
*r++ = '\\';
*r++ = *p++;
}
*r++ = ' ';
*r++ = '=';
*r++ = ' ';
for (p = t.result; *p; )
*r++ = *p++;
*r = 0;
return (ret);
}
/**
** typel_to_sl() - DUPLICATE (TYPE *) LIST AS (char **) LIST
**/
char **
#if defined(__STDC__)
typel_to_sl (
TYPE * src
)
#else
typel_to_sl (src)
TYPE *src;
#endif
{
register char **dst;
register size_t nitems;
register int n;
if (!src || !src->name)
return (0);
for (nitems = 0; src[nitems].name; nitems++)
;
if (!(dst = (char **)Malloc((nitems + 1) * sizeof(char *)))) {
errno = ENOMEM;
return (0);
}
for (n = 0; n < nitems; n++)
dst[n] = type_to_s(src[n]);
dst[nitems] = 0;
return (dst);
}
/**
** templatel_to_sl() - DUPLICATE A (TEMPLATE *) LIST AS (char **) LIST
**/
char **
#if defined(__STDC__)
templatel_to_sl (
TEMPLATE * src
)
#else
templatel_to_sl (src)
register TEMPLATE *src;
#endif
{
register char **dst;
register size_t nitems;
register int n;
if (!src || !src->keyword)
return (0);
for (nitems = 0; src[nitems].keyword; nitems++)
;
if (!(dst = (char **)Malloc((nitems + 1) * sizeof(char *)))) {
errno = ENOMEM;
return (0);
}
for (n = 0; n < nitems; n++)
dst[n] = template_to_s(src[n]);
dst[nitems] = 0;
return (dst);
}
/**
** q_strpbrk() - strpbrk() WITH BACKSLASH QUOTING
** q_strdup() - strdup() WITH BACKSLASHES OMITTED
**/
static char *
#if defined(__STDC__)
q_strchr (
char * sp,
char c
)
#else
q_strchr (sp, c)
register char *sp,
c;
#endif
{
do {
if (*sp == '\\' && sp[1])
sp += 2;
if (*sp == c)
return (sp);
} while (*sp++);
return (0);
}
static char *
#if defined(__STDC__)
q_strdup (
char * str
)
#else
q_strdup (str)
char *str;
#endif
{
char *ret;
register char *p,
*q;
register int len = 0;
for (p = str; *p; p++) {
if (*p == '\\' && p[1] == '=')
p++;
len++;
}
if (!(ret = q = Malloc(len + 1)))
return (0);
for (p = str; *p; p++) {
if (*p == '\\' && p[1] == '=')
p++;
*q++ = *p;
}
*q = 0;
return (ret);
}