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 35 void 36 func_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) (); 44 int *pnread; 45 int (*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