1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 1998 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28/*	  All Rights Reserved  	*/
29
30
31#pragma ident	"%Z%%M%	%I%	%E% SMI"
32
33#include "uucp.h"
34
35/*
36 * generate a vector of pointers (arps) to the
37 * substrings in string "s".
38 * Each substring is separated by blanks and/or tabs.
39 *	s	-> string to analyze -- s GETS MODIFIED
40 *	arps	-> array of pointers -- count + 1 pointers
41 *	count	-> max number of fields
42 * returns:
43 *	i	-> # of subfields
44 *	arps[i] = NULL
45 */
46
47GLOBAL int
48getargs(s, arps, count)
49register char *s, *arps[];
50register int count;
51{
52	register int i;
53	char	*prev;
54
55	prev = _uu_setlocale(LC_ALL, "C");
56	for (i = 0; i < count; i++) {
57		while (*s == ' ' || *s == '\t')
58			*s++ = '\0';
59		if (*s == '\n')
60			*s = '\0';
61		if (*s == '\0')
62			break;
63		arps[i] = s++;
64		while (*s != '\0' && *s != ' '
65			&& *s != '\t' && *s != '\n')
66				s++;
67	}
68	arps[i] = NULL;
69	(void) _uu_resetlocale(LC_ALL, prev);
70	return(i);
71}
72
73/*
74 *      bsfix(args) - remove backslashes from args
75 *
76 *      \123 style strings are collapsed into a single character
77 *	\000 gets mapped into \N for further processing downline.
78 *      \ at end of string is removed
79 *	\t gets replaced by a tab
80 *	\n gets replaced by a newline
81 *	\r gets replaced by a carriage return
82 *	\b gets replaced by a backspace
83 *	\s gets replaced by a blank
84 *	any other unknown \ sequence is left intact for further processing
85 *	downline.
86 */
87
88GLOBAL void
89bsfix (args)
90char **args;
91{
92	register char *str, *to, *cp;
93	register int num;
94	char	*prev;
95
96	prev = _uu_setlocale(LC_ALL, "C");
97	for (; *args; args++) {
98		str = *args;
99		for (to = str; *str; str++) {
100			if (*str == '\\') {
101				if (str[1] == '\0')
102					break;
103				switch (*++str) {
104				case '0':
105				case '1':
106				case '2':
107				case '3':
108				case '4':
109				case '5':
110				case '6':
111				case '7':
112					for ( num = 0, cp = str
113					    ; cp - str < 3
114					    ; cp++
115					    ) {
116						if ('0' <= *cp && *cp <= '7') {
117							num <<= 3;
118							num += *cp - '0';
119						}
120						else
121						    break;
122					}
123					if (num == 0) {
124						*to++ = '\\';
125						*to++ = 'N';
126					} else
127						*to++ = (char) num;
128					str = cp-1;
129					break;
130
131				case 't':
132					*to++ = '\t';
133					break;
134
135				case 's':
136					*to++ = ' ';
137					break;
138
139				case 'n':
140					*to++ = '\n';
141					break;
142
143				case 'r':
144					*to++ = '\r';
145					break;
146
147				case 'b':
148					*to++ = '\b';
149					break;
150
151				default:
152					*to++ = '\\';
153					*to++ = *str;
154					break;
155				}
156			}
157			else
158				*to++ = *str;
159		}
160		*to = '\0';
161	}
162	(void) _uu_resetlocale(LC_ALL, prev);
163	return;
164}
165
166/*
167** This routine is used so that the current
168** locale can be saved and then restored.
169*/
170char *
171_uu_setlocale(int category, char *locale)
172{
173	char *tmp, *ret;
174	int len;
175
176	/* get current locale */
177	if ((tmp = setlocale(category, NULL)) == NULL)
178		return (NULL);
179
180	/* allocate space for the current locale and copy it */
181	len = strlen(tmp) + 1;
182
183	if ((ret = malloc(len)) == NULL)
184		return ((char *) 0);
185
186	strncpy(ret, tmp, len);
187
188	/* now set the new locale */
189	if (setlocale(category, locale) == NULL) {
190		free(ret);
191		return ((char *) 0);
192	}
193	return (ret);
194}
195
196/*
197** Reset the previous locale, free memory
198*/
199void
200_uu_resetlocale(int category, char *locale)
201{
202	if (locale == NULL)
203		return;
204	(void) setlocale(category, locale);
205	free(locale);
206}
207