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 (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26 #include <stdio.h> 27 #include <string.h> 28 29 #define iseol(c) (c == 0 || c == '\n' || strchr(com, c) != NULL) 30 #define issep(c) (strchr(sep, c) != NULL) 31 #define isignore(c) (strchr(ignore, c) != NULL) 32 33 /* 34 * getaline() 35 * Read a line from a file. 36 * What's returned is a cookie to be passed to getname 37 */ 38 char ** 39 getaline(line, maxlinelen, f, lcount, com) 40 char *line; 41 int maxlinelen; 42 FILE *f; 43 int *lcount; 44 char *com; 45 { 46 char *p; 47 static char *lp; 48 do { 49 if (! fgets(line, maxlinelen, f)) { 50 return (NULL); 51 } 52 (*lcount)++; 53 } while (iseol(line[0])); 54 p = line; 55 for (;;) { 56 while (*p) { 57 p++; 58 } 59 if (*--p == '\n' && *--p == '\\') { 60 if (! fgets(p, maxlinelen, f)) { 61 break; 62 } 63 (*lcount)++; 64 } else { 65 break; 66 } 67 } 68 lp = line; 69 return (&lp); 70 } 71 72 73 /* 74 * getname() 75 * Get the next entry from the line. 76 * You tell getname() which characters to ignore before storing them 77 * into name, and which characters separate entries in a line. 78 * The cookie is updated appropriately. 79 * return: 80 * 1: one entry parsed 81 * 0: partial entry parsed, ran out of space in name 82 * -1: no more entries in line 83 */ 84 int 85 getname(name, namelen, ignore, sep, linep, com) 86 char *name; 87 int namelen; 88 char *ignore; 89 char *sep; 90 char **linep; 91 char *com; 92 { 93 register char c; 94 register char *lp; 95 register char *np; 96 97 lp = *linep; 98 do { 99 c = *lp++; 100 } while (isignore(c) && !iseol(c)); 101 if (iseol(c)) { 102 *linep = lp - 1; 103 return (-1); 104 } 105 np = name; 106 while (! issep(c) && ! iseol(c) && np - name < namelen) { 107 *np++ = c; 108 c = *lp++; 109 } 110 lp--; 111 if (np - name < namelen) { 112 *np = 0; 113 if (iseol(c)) { 114 *lp = 0; 115 } else { 116 lp++; /* advance over separator */ 117 } 118 } else { 119 *linep = lp; 120 return (0); 121 } 122 *linep = lp; 123 return (1); 124 } 125