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