16185db85Sdougm /* 26185db85Sdougm * CDDL HEADER START 36185db85Sdougm * 46185db85Sdougm * The contents of this file are subject to the terms of the 56185db85Sdougm * Common Development and Distribution License (the "License"). 66185db85Sdougm * You may not use this file except in compliance with the License. 76185db85Sdougm * 86185db85Sdougm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96185db85Sdougm * or http://www.opensolaris.org/os/licensing. 106185db85Sdougm * See the License for the specific language governing permissions 116185db85Sdougm * and limitations under the License. 126185db85Sdougm * 136185db85Sdougm * When distributing Covered Code, include this CDDL HEADER in each 146185db85Sdougm * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156185db85Sdougm * If applicable, add the following below this CDDL HEADER, with the 166185db85Sdougm * fields enclosed by brackets "[]" replaced with your own identifying 176185db85Sdougm * information: Portions Copyright [yyyy] [name of copyright owner] 186185db85Sdougm * 196185db85Sdougm * CDDL HEADER END 206185db85Sdougm */ 216185db85Sdougm 226185db85Sdougm /* 23*8d7e4166Sjose borrego * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 246185db85Sdougm * Use is subject to license terms. 256185db85Sdougm */ 266185db85Sdougm 276185db85Sdougm #include <stdio.h> 286185db85Sdougm #include <ctype.h> 296185db85Sdougm 306185db85Sdougm #define TK_INIT 0 316185db85Sdougm #define TK_TOKEN 1 326185db85Sdougm #define TK_SKIPWHITE 2 336185db85Sdougm #define TK_QUOTED 3 346185db85Sdougm 356185db85Sdougm /* 366185db85Sdougm * assumes quoted strings are delimited by white space (i.e sp 376185db85Sdougm * "string" sp). Backslash can be used to quote a quote mark. 386185db85Sdougm * quoted strings will have the quotes stripped. 396185db85Sdougm */ 406185db85Sdougm 416185db85Sdougm char * 42*8d7e4166Sjose borrego _sa_get_token(char *string) 436185db85Sdougm { 446185db85Sdougm static char *orig = NULL; 456185db85Sdougm static char *curp; 466185db85Sdougm char *ret; 476185db85Sdougm int state = TK_INIT; 486185db85Sdougm int c; 496185db85Sdougm int quotechar; 506185db85Sdougm 516185db85Sdougm if (string != orig || string == NULL) { 526185db85Sdougm orig = string; 536185db85Sdougm curp = string; 546185db85Sdougm if (string == NULL) { 556185db85Sdougm return (NULL); 566185db85Sdougm } 576185db85Sdougm } 586185db85Sdougm ret = curp; 596185db85Sdougm while ((c = *curp) != '\0') { 606185db85Sdougm switch (state) { 616185db85Sdougm case TK_SKIPWHITE: 626185db85Sdougm case TK_INIT: 636185db85Sdougm if (isspace(c)) { 646185db85Sdougm while (*curp && isspace(*curp)) 656185db85Sdougm curp++; 666185db85Sdougm ret = curp; 676185db85Sdougm } 686185db85Sdougm if (c == '"' || c == '\'') { 696185db85Sdougm state = TK_QUOTED; 706185db85Sdougm curp++; 716185db85Sdougm ret = curp; 726185db85Sdougm quotechar = c; /* want to match for close */ 736185db85Sdougm } else { 746185db85Sdougm state = TK_TOKEN; 756185db85Sdougm } 766185db85Sdougm break; 776185db85Sdougm case TK_TOKEN: 786185db85Sdougm switch (c) { 796185db85Sdougm case '\\': 806185db85Sdougm curp++; 816185db85Sdougm if (*curp) { 826185db85Sdougm curp++; 836185db85Sdougm break; 846185db85Sdougm } else { 856185db85Sdougm return (ret); 866185db85Sdougm } 876185db85Sdougm break; 886185db85Sdougm default: 896185db85Sdougm if (*curp == '\0' || isspace(c)) { 906185db85Sdougm *curp++ = '\0'; 916185db85Sdougm return (ret); 926185db85Sdougm } 936185db85Sdougm curp++; 946185db85Sdougm break; 956185db85Sdougm } 966185db85Sdougm break; 976185db85Sdougm case TK_QUOTED: 986185db85Sdougm switch (c) { 996185db85Sdougm case '\\': 1006185db85Sdougm curp++; 1016185db85Sdougm if (*curp) { 1026185db85Sdougm curp++; 1036185db85Sdougm break; 1046185db85Sdougm } 1056185db85Sdougm curp++; 1066185db85Sdougm break; 1076185db85Sdougm default: 1086185db85Sdougm if (c == '\0' || c == quotechar) { 1096185db85Sdougm *curp++ = '\0'; 1106185db85Sdougm return (ret); 1116185db85Sdougm } 1126185db85Sdougm curp++; 1136185db85Sdougm break; 1146185db85Sdougm } 1156185db85Sdougm break; 1166185db85Sdougm } 1176185db85Sdougm } 1186185db85Sdougm return (NULL); 1196185db85Sdougm } 120