#include "stdio.h"
#include "string.h"
#include "errno.h"
#include "stdlib.h"
#include "lp.h"
#include "lp.set.h"
#if defined(__STDC__)
char * tparm ( char * , ... );
#else
extern char *tparm();
#endif
#if defined(__STDC__)
static int cat_charset ( char *, int , char * , int );
#else
static int cat_charset();
#endif
int
#if defined(__STDC__)
set_charset (
char * char_set,
int putout,
char * type
)
#else
set_charset (char_set, putout, type)
char *char_set;
int putout;
char *type;
#endif
{
int cs,
ret;
char *rest,
*char_set_nm,
*char_set_names,
*select_char_set,
*start_char_set_def,
*p,
*q;
unsigned short has_print_wheel;
tidbit ((char *)0, "daisy", &has_print_wheel);
if (has_print_wheel)
return (E_SUCCESS);
tidbit ((char *)0, "csnm", &char_set_names);
if (
strlen(char_set) > (size_t) 2
&& char_set[0] == 'c'
&& char_set[1] == 's'
&& char_set[2]
&& 0 <= (cs = strtol(char_set + 2, &rest, 10)) && cs <= 63
&& !*rest
)
char_set_nm = tparm(char_set_names, cs);
else {
for (cs = 0; cs <= 63; cs++)
if (
(char_set_nm = tparm(char_set_names, cs))
&& *char_set_nm
&& STREQU(char_set_nm, char_set)
)
break;
if (cs > 63)
return (E_FAILURE);
}
if (cs == 0)
return (E_SUCCESS);
if (char_set_nm)
if (!(char_set_nm = Strdup(char_set_nm))) {
errno = ENOMEM;
ret = E_FAILURE;
goto Return;
}
tidbit ((char *)0, "scs", &select_char_set);
p = q = 0;
if ((p = tparm(select_char_set, cs)) && *p && (p = Strdup(p))) {
tidbit ((char *)0, "scsd", &start_char_set_def);
if ((q = tparm(start_char_set_def, cs)) && *q) {
if (
OKAY(char_set_nm)
&& cat_charset(char_set_nm, 0, type, putout) != -1
|| cat_charset((char *)0, cs, type, putout) != -1
|| cat_charset(char_set, 0, type, putout) != -1
)
;
else {
ret = E_FAILURE;
goto Return;
}
} else {
if (
OKAY(char_set_nm)
&& cat_charset(char_set_nm, 0, type, putout) != -1
|| cat_charset((char *)0, cs, type, putout) != -1
|| cat_charset(char_set, 0, type, putout) != -1
)
;
}
if (putout)
putp (p);
ret = E_SUCCESS;
} else
ret = E_FAILURE;
Return: if (p)
Free (p);
if (q)
Free (q);
if (char_set_nm)
Free (char_set_nm);
return (ret);
}
static int
#if defined(__STDC__)
cat_charset (
char * name,
int number,
char * type,
int putout
)
#else
cat_charset (name, number, type, putout)
char *name;
int number,
putout;
char *type;
#endif
{
int fd;
char *p,
*parent,
*T,
buf[BUFSIZ];
int n,
ret;
if (!name)
sprintf ((name = "63"), "%d", number);
if (!(parent = getenv("CHARSETDIR")))
parent = CHARSETDIR;
(T = "x")[0] = type[0];
p = makepath(parent, T, type, name, (char *)0);
if (!p)
return (-1);
if ((fd = open_locked(p, "r", 0)) < 0) {
Free (p);
return (-1);
}
Free (p);
if (putout) {
errno = 0;
while ((n = read(fd, buf, BUFSIZ)))
fwrite (buf, 1, n, stdout);
if (errno != 0)
ret = -1;
else
ret = 0;
}
close(fd);
return (ret);
}