1*da6c28aaSamw /* 2*da6c28aaSamw * CDDL HEADER START 3*da6c28aaSamw * 4*da6c28aaSamw * The contents of this file are subject to the terms of the 5*da6c28aaSamw * Common Development and Distribution License (the "License"). 6*da6c28aaSamw * You may not use this file except in compliance with the License. 7*da6c28aaSamw * 8*da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10*da6c28aaSamw * See the License for the specific language governing permissions 11*da6c28aaSamw * and limitations under the License. 12*da6c28aaSamw * 13*da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14*da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16*da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17*da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18*da6c28aaSamw * 19*da6c28aaSamw * CDDL HEADER END 20*da6c28aaSamw */ 21*da6c28aaSamw /* 22*da6c28aaSamw * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*da6c28aaSamw * Use is subject to license terms. 24*da6c28aaSamw */ 25*da6c28aaSamw 26*da6c28aaSamw /* 27*da6c28aaSamw * Implementation of some of the string functions. 28*da6c28aaSamw */ 29*da6c28aaSamw 30*da6c28aaSamw #pragma ident "%Z%%M% %I% %E% SMI" 31*da6c28aaSamw 32*da6c28aaSamw #ifdef _KERNEL 33*da6c28aaSamw #include <sys/types.h> 34*da6c28aaSamw #include <sys/sunddi.h> 35*da6c28aaSamw #else 36*da6c28aaSamw #include <stdlib.h> 37*da6c28aaSamw #include <string.h> 38*da6c28aaSamw #include <strings.h> 39*da6c28aaSamw #endif 40*da6c28aaSamw #include <smbsrv/alloc.h> 41*da6c28aaSamw #include <smbsrv/string.h> 42*da6c28aaSamw #include <smbsrv/ctype.h> 43*da6c28aaSamw 44*da6c28aaSamw 45*da6c28aaSamw /* 46*da6c28aaSamw * strsubst 47*da6c28aaSamw * 48*da6c28aaSamw * Scan a string replacing all occurrences of orgchar with newchar. 49*da6c28aaSamw * Returns a pointer to s, or null of s is null. 50*da6c28aaSamw */ 51*da6c28aaSamw char * 52*da6c28aaSamw strsubst(char *s, char orgchar, char newchar) 53*da6c28aaSamw { 54*da6c28aaSamw char *p = s; 55*da6c28aaSamw 56*da6c28aaSamw if (p == 0) 57*da6c28aaSamw return (0); 58*da6c28aaSamw 59*da6c28aaSamw while (*p) { 60*da6c28aaSamw if (*p == orgchar) 61*da6c28aaSamw *p = newchar; 62*da6c28aaSamw ++p; 63*da6c28aaSamw } 64*da6c28aaSamw 65*da6c28aaSamw return (s); 66*da6c28aaSamw } 67*da6c28aaSamw 68*da6c28aaSamw /* 69*da6c28aaSamw * strcanon 70*da6c28aaSamw * 71*da6c28aaSamw * Normalize a string by reducing all the repeated characters in 72*da6c28aaSamw * buf as defined by class. For example; 73*da6c28aaSamw * 74*da6c28aaSamw * char *buf = strdup("/d1//d2//d3\\\\d4\\\\f1.txt"); 75*da6c28aaSamw * strcanon(buf, "/\\"); 76*da6c28aaSamw * 77*da6c28aaSamw * Would result in buf containing the following string: 78*da6c28aaSamw * 79*da6c28aaSamw * /d1/d2/d3\d4\f1.txt 80*da6c28aaSamw * 81*da6c28aaSamw * This function modifies the contents of buf in place and returns 82*da6c28aaSamw * a pointer to buf. 83*da6c28aaSamw */ 84*da6c28aaSamw char * 85*da6c28aaSamw strcanon(char *buf, const char *class) 86*da6c28aaSamw { 87*da6c28aaSamw char *p = buf; 88*da6c28aaSamw char *q = buf; 89*da6c28aaSamw char *r; 90*da6c28aaSamw 91*da6c28aaSamw while (*p) { 92*da6c28aaSamw *q++ = *p; 93*da6c28aaSamw 94*da6c28aaSamw if ((r = strchr(class, *p)) != 0) { 95*da6c28aaSamw while (*p == *r) 96*da6c28aaSamw ++p; 97*da6c28aaSamw } else 98*da6c28aaSamw ++p; 99*da6c28aaSamw } 100*da6c28aaSamw 101*da6c28aaSamw *q = '\0'; 102*da6c28aaSamw return (buf); 103*da6c28aaSamw } 104