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#pragma ident	"%Z%%M%	%I%	%E% SMI"
23
24/*
25 * Copyright (c) 1988 by Sun Microsystems, Inc.
26 */
27
28#include <ctype.h>
29#include <stdio.h>
30#ifndef PRE41
31#include <locale.h>
32#endif
33#include "base_conversion.h"
34
35void
36func_to_decimal(ppc, nmax, fortran_conventions, pd, pform, pechar, pget, pnread, punget)
37	char          **ppc;
38	int             nmax;
39	int             fortran_conventions;
40	decimal_record *pd;
41	enum decimal_string_form *pform;
42	char          **pechar;
43	int             (*pget) ();
44int            *pnread;
45int             (*punget) ();
46
47{
48	register char  *cp = *ppc;
49	register int    current;
50	register int    nread = 1;	/* Number of characters read so far. */
51	char           *good = cp - 1;	/* End of known good token. */
52	char           *cp0 = cp;
53
54	current = (*pget) ();	/* Initialize buffer. */
55	*cp = current;
56
57#define ATEOF current
58#define CURRENT current
59#define NEXT \
60	if (nread < nmax) \
61		{ cp++ ; current = (*pget)() ; *cp = current ; nread++ ;} \
62	else \
63		{ current = NULL ; } ;
64
65#include "char_to_decimal.h"
66#undef CURRENT
67#undef NEXT
68
69	if ((nread < nmax) && (punget != NULL)) {
70		while (cp >= *ppc) {	/* Push back as many excess
71					 * characters as possible. */
72			if (*cp != EOF) {	/* Can't push back EOF. */
73				if ((*punget) (*cp) == EOF)
74					break;
75			}
76			cp--;
77			nread--;
78		}
79	}
80	cp++;
81	*cp = 0;		/* Terminating null. */
82	*pnread = nread;
83}
84