summaryrefslogtreecommitdiff
path: root/usr/src/cmd/ttymon/tmparse.c
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/cmd/ttymon/tmparse.c
downloadillumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/cmd/ttymon/tmparse.c')
-rw-r--r--usr/src/cmd/ttymon/tmparse.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/usr/src/cmd/ttymon/tmparse.c b/usr/src/cmd/ttymon/tmparse.c
new file mode 100644
index 0000000000..ccc2065832
--- /dev/null
+++ b/usr/src/cmd/ttymon/tmparse.c
@@ -0,0 +1,149 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
+
+#include <stdio.h>
+#include <ctype.h>
+
+/*
+ * getword - extract one token from the string
+ * - token delimiter is white space if getall is FALSE
+ * - token delimiter is ':' or '\0' if getall is TRUE
+ */
+char *
+getword(ptr, size, getall)
+register char *ptr; /* pointer to the string to be scanned */
+int *size; /* *size = number of characters scanned */
+int getall; /* if TRUE, get all char until ':' or '\0' */
+{
+ register char *optr,c;
+ char quoted();
+ static char word[BUFSIZ];
+ int qsize;
+
+ *size = 0;
+ if (!getall) {
+ /* Skip all white spaces */
+ while (isspace(*ptr)) {
+ (*size)++;
+ ptr++;
+ }
+ }
+
+ /* Put all characters from here to next white space or ':' or '\0' */
+ /* into the word, up to the size of the word. */
+ for (optr= word,*optr='\0';
+ *ptr != '\0' && *ptr != ':'; ptr++,(*size)++) {
+ if (!getall) {
+ if (isspace(*ptr))
+ break;
+ }
+
+ /* If the character is quoted, analyze it. */
+ if (*ptr == '\\') {
+ c = quoted(ptr,&qsize);
+ (*size) += qsize;
+ ptr += qsize;
+ } else c = *ptr;
+
+ /* If there is room, add this character to the word. */
+ if (optr < &word[BUFSIZ] ) *optr++ = c;
+ }
+
+ /* skip trailing blanks if any*/
+ while (isspace(*ptr)) {
+ (*size)++;
+ ptr++;
+ }
+
+ /* Make sure the line is null terminated. */
+ *optr++ = '\0';
+ return(word);
+}
+
+/* "quoted" takes a quoted character, starting at the quote */
+/* character, and returns a single character plus the size of */
+/* the quote string. "quoted" recognizes the following as */
+/* special, \n,\r,\v,\t,\b,\f as well as the \nnn notation. */
+char
+quoted(ptr,qsize)
+char *ptr;
+int *qsize;
+{
+ register char c,*rptr;
+ register int i;
+
+ rptr = ptr;
+ switch(*++rptr) {
+ case 'n':
+ c = '\n';
+ break;
+ case 'r':
+ c = '\r';
+ break;
+ case 'v':
+ c = '\013';
+ break;
+ case 'b':
+ c = '\b';
+ break;
+ case 't':
+ c = '\t';
+ break;
+ case 'f':
+ c = '\f';
+ break;
+ case ':':
+ c = ':';
+ break;
+ default:
+
+/* If this is a numeric string, take up to three characters of */
+/* it as the value of the quoted character. */
+ if (*rptr >= '0' && *rptr <= '7') {
+ for (i=0,c=0; i < 3;i++) {
+ c = c*8 + (*rptr - '0');
+ if (*++rptr < '0' || *rptr > '7') break;
+ }
+ rptr--;
+
+/* If the character following the '\\' is a NULL, back up the */
+/* ptr so that the NULL won't be missed. The sequence */
+/* backslash null is essentually illegal. */
+ } else if (*rptr == '\0') {
+ c = '\0';
+ rptr--;
+
+ /* In all other cases the quoting does nothing. */
+ } else c = *rptr;
+ break;
+ }
+
+ /* Compute the size of the quoted character. */
+ (*qsize) = rptr - ptr;
+ return(c);
+}
+