15184Sek110237 /* 25184Sek110237 * CDDL HEADER START 35184Sek110237 * 45184Sek110237 * The contents of this file are subject to the terms of the 55184Sek110237 * Common Development and Distribution License (the "License"). 65184Sek110237 * You may not use this file except in compliance with the License. 75184Sek110237 * 85184Sek110237 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95184Sek110237 * or http://www.opensolaris.org/os/licensing. 105184Sek110237 * See the License for the specific language governing permissions 115184Sek110237 * and limitations under the License. 125184Sek110237 * 135184Sek110237 * When distributing Covered Code, include this CDDL HEADER in each 145184Sek110237 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155184Sek110237 * If applicable, add the following below this CDDL HEADER, with the 165184Sek110237 * fields enclosed by brackets "[]" replaced with your own identifying 175184Sek110237 * information: Portions Copyright [yyyy] [name of copyright owner] 185184Sek110237 * 195184Sek110237 * CDDL HEADER END 205184Sek110237 */ 215184Sek110237 /* 226613Sek110237 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 235184Sek110237 * Use is subject to license terms. 246613Sek110237 * 256613Sek110237 * Portions Copyright 2008 Denis Cheng 265184Sek110237 */ 275184Sek110237 285184Sek110237 #include <limits.h> 295184Sek110237 #include <string.h> 305184Sek110237 #include <stdlib.h> 315184Sek110237 #include <stdarg.h> 325184Sek110237 #include <stdio.h> 335184Sek110237 #include <errno.h> 345184Sek110237 #ifdef HAVE_STDINT_H 355184Sek110237 #include <stdint.h> 365184Sek110237 #endif 376613Sek110237 386613Sek110237 #include "filebench.h" 395184Sek110237 #include "utils.h" 405184Sek110237 #include "parsertypes.h" 415184Sek110237 425184Sek110237 /* 43*7946SAndrew.W.Wilson@sun.com * For now, just three routines: one to allocate a string in shared 44*7946SAndrew.W.Wilson@sun.com * memory, one to emulate a strlcpy() function and one to emulate a 45*7946SAndrew.W.Wilson@sun.com * strlcat() function, both the second and third only used in non 46*7946SAndrew.W.Wilson@sun.com * Solaris environments, 475184Sek110237 * 485184Sek110237 */ 495184Sek110237 505184Sek110237 515184Sek110237 /* 525184Sek110237 * Allocates space for a new string of the same length as 535184Sek110237 * the supplied string "str". Copies the old string into 545184Sek110237 * the new string and returns a pointer to the new string. 555184Sek110237 * Returns NULL if memory allocation for the new string fails. 565184Sek110237 */ 575184Sek110237 char * 585184Sek110237 fb_stralloc(char *str) 595184Sek110237 { 605184Sek110237 char *newstr; 615184Sek110237 625184Sek110237 if ((newstr = malloc(strlen(str) + 1)) == NULL) 635184Sek110237 return (NULL); 645184Sek110237 (void) strcpy(newstr, str); 655184Sek110237 return (newstr); 665184Sek110237 } 67*7946SAndrew.W.Wilson@sun.com 68*7946SAndrew.W.Wilson@sun.com #ifndef sun 69*7946SAndrew.W.Wilson@sun.com 70*7946SAndrew.W.Wilson@sun.com /* 71*7946SAndrew.W.Wilson@sun.com * Implements the strlcpy function when compilied for non Solaris 72*7946SAndrew.W.Wilson@sun.com * operating systems. On solaris the strlcpy() function is used 73*7946SAndrew.W.Wilson@sun.com * directly. 74*7946SAndrew.W.Wilson@sun.com */ 75*7946SAndrew.W.Wilson@sun.com size_t 76*7946SAndrew.W.Wilson@sun.com fb_strlcpy(char *dst, const char *src, size_t dstsize) 77*7946SAndrew.W.Wilson@sun.com { 78*7946SAndrew.W.Wilson@sun.com uint_t i; 79*7946SAndrew.W.Wilson@sun.com 80*7946SAndrew.W.Wilson@sun.com for (i = 0; i < (dstsize - 1); i++) { 81*7946SAndrew.W.Wilson@sun.com 82*7946SAndrew.W.Wilson@sun.com /* quit if at end of source string */ 83*7946SAndrew.W.Wilson@sun.com if (src[i] == '\0') 84*7946SAndrew.W.Wilson@sun.com break; 85*7946SAndrew.W.Wilson@sun.com 86*7946SAndrew.W.Wilson@sun.com dst[i] = src[i]; 87*7946SAndrew.W.Wilson@sun.com } 88*7946SAndrew.W.Wilson@sun.com 89*7946SAndrew.W.Wilson@sun.com /* set end of dst string to \0 */ 90*7946SAndrew.W.Wilson@sun.com dst[i] = '\0'; 91*7946SAndrew.W.Wilson@sun.com i++; 92*7946SAndrew.W.Wilson@sun.com 93*7946SAndrew.W.Wilson@sun.com return (i); 94*7946SAndrew.W.Wilson@sun.com } 95*7946SAndrew.W.Wilson@sun.com 96*7946SAndrew.W.Wilson@sun.com /* 97*7946SAndrew.W.Wilson@sun.com * Implements the strlcat function when compilied for non Solaris 98*7946SAndrew.W.Wilson@sun.com * operating systems. On solaris the strlcat() function is used 99*7946SAndrew.W.Wilson@sun.com * directly. 100*7946SAndrew.W.Wilson@sun.com */ 101*7946SAndrew.W.Wilson@sun.com size_t 102*7946SAndrew.W.Wilson@sun.com fb_strlcat(char *dst, const char *src, size_t dstsize) 103*7946SAndrew.W.Wilson@sun.com { 104*7946SAndrew.W.Wilson@sun.com uint_t i, j; 105*7946SAndrew.W.Wilson@sun.com 106*7946SAndrew.W.Wilson@sun.com /* find the end of the current destination string */ 107*7946SAndrew.W.Wilson@sun.com for (i = 0; i < (dstsize - 1); i++) { 108*7946SAndrew.W.Wilson@sun.com if (dst[i] == '\0') 109*7946SAndrew.W.Wilson@sun.com break; 110*7946SAndrew.W.Wilson@sun.com } 111*7946SAndrew.W.Wilson@sun.com 112*7946SAndrew.W.Wilson@sun.com /* append the source string to the destination string */ 113*7946SAndrew.W.Wilson@sun.com for (j = 0; i < (dstsize - 1); i++) { 114*7946SAndrew.W.Wilson@sun.com if (src[j] == '\0') 115*7946SAndrew.W.Wilson@sun.com break; 116*7946SAndrew.W.Wilson@sun.com 117*7946SAndrew.W.Wilson@sun.com dst[i] = src[j]; 118*7946SAndrew.W.Wilson@sun.com j++; 119*7946SAndrew.W.Wilson@sun.com } 120*7946SAndrew.W.Wilson@sun.com 121*7946SAndrew.W.Wilson@sun.com /* set end of dst string to \0 */ 122*7946SAndrew.W.Wilson@sun.com dst[i] = '\0'; 123*7946SAndrew.W.Wilson@sun.com i++; 124*7946SAndrew.W.Wilson@sun.com 125*7946SAndrew.W.Wilson@sun.com return (i); 126*7946SAndrew.W.Wilson@sun.com } 127*7946SAndrew.W.Wilson@sun.com 128*7946SAndrew.W.Wilson@sun.com #endif /* !sun */ 129