1*e23c41c9SAli Bahrami /* 2*e23c41c9SAli Bahrami * CDDL HEADER START 3*e23c41c9SAli Bahrami * 4*e23c41c9SAli Bahrami * The contents of this file are subject to the terms of the 5*e23c41c9SAli Bahrami * Common Development and Distribution License (the "License"). 6*e23c41c9SAli Bahrami * You may not use this file except in compliance with the License. 7*e23c41c9SAli Bahrami * 8*e23c41c9SAli Bahrami * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*e23c41c9SAli Bahrami * or http://www.opensolaris.org/os/licensing. 10*e23c41c9SAli Bahrami * See the License for the specific language governing permissions 11*e23c41c9SAli Bahrami * and limitations under the License. 12*e23c41c9SAli Bahrami * 13*e23c41c9SAli Bahrami * When distributing Covered Code, include this CDDL HEADER in each 14*e23c41c9SAli Bahrami * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*e23c41c9SAli Bahrami * If applicable, add the following below this CDDL HEADER, with the 16*e23c41c9SAli Bahrami * fields enclosed by brackets "[]" replaced with your own identifying 17*e23c41c9SAli Bahrami * information: Portions Copyright [yyyy] [name of copyright owner] 18*e23c41c9SAli Bahrami * 19*e23c41c9SAli Bahrami * CDDL HEADER END 20*e23c41c9SAli Bahrami */ 21*e23c41c9SAli Bahrami 22*e23c41c9SAli Bahrami /* 23*e23c41c9SAli Bahrami * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*e23c41c9SAli Bahrami * Use is subject to license terms. 25*e23c41c9SAli Bahrami */ 26*e23c41c9SAli Bahrami 27*e23c41c9SAli Bahrami 28*e23c41c9SAli Bahrami /* 29*e23c41c9SAli Bahrami * General purpse string manipulation routines 30*e23c41c9SAli Bahrami */ 31*e23c41c9SAli Bahrami 32*e23c41c9SAli Bahrami #include <stdio.h> 33*e23c41c9SAli Bahrami #include <_conv.h> 34*e23c41c9SAli Bahrami 35*e23c41c9SAli Bahrami 36*e23c41c9SAli Bahrami /* 37*e23c41c9SAli Bahrami * Implementation of isspace() that does not require <ctype.h> 38*e23c41c9SAli Bahrami * or <sys/ctype.h>, appropriate for simple non-localized use. 39*e23c41c9SAli Bahrami */ 40*e23c41c9SAli Bahrami int 41*e23c41c9SAli Bahrami conv_strproc_isspace(int c) 42*e23c41c9SAli Bahrami { 43*e23c41c9SAli Bahrami return ((c == ' ') || (c == '\t') || (c == '\r') || (c == '\n')); 44*e23c41c9SAli Bahrami } 45*e23c41c9SAli Bahrami 46*e23c41c9SAli Bahrami /* 47*e23c41c9SAli Bahrami * Remove leading and trailing whitespace from the given string. 48*e23c41c9SAli Bahrami * 49*e23c41c9SAli Bahrami * entry: 50*e23c41c9SAli Bahrami * str - String to be trimmed 51*e23c41c9SAli Bahrami * 52*e23c41c9SAli Bahrami * exit: 53*e23c41c9SAli Bahrami * The pointer to the trimmed string is returned. 54*e23c41c9SAli Bahrami * 55*e23c41c9SAli Bahrami * note: 56*e23c41c9SAli Bahrami * Leading whitespace is trimmed by advancing the given str pointer, 57*e23c41c9SAli Bahrami * and not by making a copy or allocing more memory. Hence, the caller 58*e23c41c9SAli Bahrami * should retain a copy of the original str pointer if they need to 59*e23c41c9SAli Bahrami * free the original memory or otherwise access it. 60*e23c41c9SAli Bahrami * 61*e23c41c9SAli Bahrami * Trailing whitespace is trimmed by inserting a NULL termination 62*e23c41c9SAli Bahrami * in the position at which the first trailing whitespce character 63*e23c41c9SAli Bahrami * lies. This routine can therefore modify the memory used by 64*e23c41c9SAli Bahrami * the input string. 65*e23c41c9SAli Bahrami */ 66*e23c41c9SAli Bahrami char * 67*e23c41c9SAli Bahrami conv_strproc_trim(char *str) 68*e23c41c9SAli Bahrami { 69*e23c41c9SAli Bahrami char *tail; 70*e23c41c9SAli Bahrami 71*e23c41c9SAli Bahrami /* Skip leading whitespace */ 72*e23c41c9SAli Bahrami while (conv_strproc_isspace(*str)) 73*e23c41c9SAli Bahrami str++; 74*e23c41c9SAli Bahrami 75*e23c41c9SAli Bahrami /* Back up over trailing whitespace */ 76*e23c41c9SAli Bahrami tail = str + strlen(str); 77*e23c41c9SAli Bahrami while ((tail > str) && conv_strproc_isspace(*(tail - 1))) 78*e23c41c9SAli Bahrami tail--; 79*e23c41c9SAli Bahrami *tail = '\0'; 80*e23c41c9SAli Bahrami 81*e23c41c9SAli Bahrami return (str); 82*e23c41c9SAli Bahrami } 83*e23c41c9SAli Bahrami 84*e23c41c9SAli Bahrami /* 85*e23c41c9SAli Bahrami * Given a debug token of the form: 86*e23c41c9SAli Bahrami * 87*e23c41c9SAli Bahrami * token=value 88*e23c41c9SAli Bahrami * 89*e23c41c9SAli Bahrami * extract and return a pointer to the value. 90*e23c41c9SAli Bahrami * 91*e23c41c9SAli Bahrami * entry: 92*e23c41c9SAli Bahrami * str - String to process 93*e23c41c9SAli Bahrami * token_len = Length of the token, not counting the '=' character, 94*e23c41c9SAli Bahrami * or any whitespace between the token and the '='. 95*e23c41c9SAli Bahrami * to_upper - True to convert the returned value to upper case. 96*e23c41c9SAli Bahrami * value - Address of pointer to receive the value string. 97*e23c41c9SAli Bahrami * 98*e23c41c9SAli Bahrami * exit: 99*e23c41c9SAli Bahrami * On success, *value is updated to point at the value string, 100*e23c41c9SAli Bahrami * and True (1) is returned. On failure, False (0) is returned. 101*e23c41c9SAli Bahrami * 102*e23c41c9SAli Bahrami * note: 103*e23c41c9SAli Bahrami * If CONV_SPEXV_F_UCASE is specified, this routine modifies 104*e23c41c9SAli Bahrami * the memory pointed at by str. 105*e23c41c9SAli Bahrami */ 106*e23c41c9SAli Bahrami Boolean 107*e23c41c9SAli Bahrami conv_strproc_extract_value(char *str, size_t token_len, int flags, 108*e23c41c9SAli Bahrami const char **value) 109*e23c41c9SAli Bahrami { 110*e23c41c9SAli Bahrami int trim = (flags & CONV_SPEXV_F_NOTRIM) == 0; 111*e23c41c9SAli Bahrami 112*e23c41c9SAli Bahrami /* Skip the token */ 113*e23c41c9SAli Bahrami str += token_len; 114*e23c41c9SAli Bahrami 115*e23c41c9SAli Bahrami /* 116*e23c41c9SAli Bahrami * If TRIM, skip whitespace between token and '=' 117*e23c41c9SAli Bahrami */ 118*e23c41c9SAli Bahrami if (trim) 119*e23c41c9SAli Bahrami while (conv_strproc_isspace(*str)) 120*e23c41c9SAli Bahrami str++; 121*e23c41c9SAli Bahrami 122*e23c41c9SAli Bahrami /* If there's not a '=' here, this isn't the token we thought it was */ 123*e23c41c9SAli Bahrami if (*str != '=') 124*e23c41c9SAli Bahrami return (FALSE); 125*e23c41c9SAli Bahrami 126*e23c41c9SAli Bahrami str++; /* skip the '=' */ 127*e23c41c9SAli Bahrami 128*e23c41c9SAli Bahrami /* if TRIM, skip whitespace following the '=' */ 129*e23c41c9SAli Bahrami if (trim) 130*e23c41c9SAli Bahrami while (conv_strproc_isspace(*str)) 131*e23c41c9SAli Bahrami str++; 132*e23c41c9SAli Bahrami 133*e23c41c9SAli Bahrami /* Null value and it's not OK? Make it an error. */ 134*e23c41c9SAli Bahrami if (((flags & CONV_SPEXV_F_NULLOK) == 0) && (*str == '\0')) 135*e23c41c9SAli Bahrami return (FALSE); 136*e23c41c9SAli Bahrami 137*e23c41c9SAli Bahrami *value = str; 138*e23c41c9SAli Bahrami 139*e23c41c9SAli Bahrami /* Convert to uppercase on request */ 140*e23c41c9SAli Bahrami if (flags & CONV_SPEXV_F_UCASE) 141*e23c41c9SAli Bahrami for (; *str; str++) 142*e23c41c9SAli Bahrami if ((*str >= 'a') && (*str <= 'z')) 143*e23c41c9SAli Bahrami *str = *str - ('a' - 'A'); 144*e23c41c9SAli Bahrami 145*e23c41c9SAli Bahrami return (TRUE); 146*e23c41c9SAli Bahrami } 147