home *** CD-ROM | disk | FTP | other *** search
- From: davidsen@steinmetz.UUCP (William E. Davidsen Jr)
- Newsgroups: comp.sources.misc
- Subject: v02i074: a command line substring function
- Message-ID: <9930@steinmetz.steinmetz.UUCP>
- Date: 14 Mar 88 21:23:12 GMT
- Approved: allbery@ncoast.UUCP
-
- comp.sources.misc: Volume 2, Issue 74
- Submitted-By: "William E. Davidsen Jr" <davidsen@steinmetz.UUCP>
- Archive-Name: substr
-
- There were some references to neat ksh tricks for substrings, and I
- thought that this routine would be useful. It is a LOT easier to
- remember than the tricks for subshell, and more portable, too. I haven't
- tried it in other o/s, but it should run in DOS and such.
-
- :
- #!/bin/sh
- # shar+ created from directory /usr2/davidsen/bin/src
- # 14:54 on Mon Mar 14, 1988 by davidsen
- echo 'x - substr.c (text)'
- sed << 'E!O!F' 's/^X//' > substr.c
- X#include <stdio.h>
- X
- Xstatic char SCCSid[] = {"@(#)substr.c v1.2 - 11/16/87"};
- X
- Xmain (argc, argv)
- X int argc;
- X char *argv[];
- X{
- X register char *ptr;
- X register char ch;
- X int start, end; /* first and last character to extract */
- X int slen; /* string length */
- X
- X if (argc < 4)
- X exit (0);
- X start = atoi (argv[2]);
- X end = atoi (argv[3]);
- X slen = strlen(argv[1]);
- X if (slen == 0) exit(1);
- X
- X /* test for special values */
- X if (start < 0)
- X start += slen + 1;
- X if (end == 0)
- X end = slen - start + 1;
- X else if (end < 0)
- X end += slen - (start - 1);
- X
- X /* validate the values */
- X if (start < 1 || end < 1)
- X exit (1);
- X
- X ptr = argv[1] + start - 1;
- X while (end-- && (ch = *ptr++))
- X putchar (ch);
- X putchar ('\n');
- X exit(0);
- X}
- E!O!F
- newsize=`wc -c < substr.c`
- if [ $newsize -ne 791 ]
- then echo "File substr.c was $newsize bytes, 791 expected"
- fi
- echo 'x - substr.1 (text)'
- sed << 'E!O!F' 's/^X//' > substr.1
- X'\" @(#)Documentation for the 'substr' command
- X'\" * * * this man page requires the 'tbl' preprocessor * * *
- X.TH substr 1
- X.SH NAME
- Xsubstr - extract a substring from the input arguments
- X.SH SYNOPSIS
- Xsubstr string start_char num_of_char
- X.SH DESCRIPTION
- Xsubstr extracts characters from a string provided as the first argument, and
- Xwrites the characters extracted to standard output. This avoids having
- Xto use other proprietary methods to accomplish extraction.
- X.SS Special values
- XThe second argument is the first character to be extracted. Numbering is
- Xfrom one rather than zero. If the starting value is negative it is
- Xrelative to the last character, such as -2 means the last two characters
- Xin the first argument.
- XThe third argument is the number of characters to extract.
- XIf the third argument is zero, all characters right of the starting
- Xposition are extracted. If the length
- Xargument is negative, it is adjusted to end relative to the end of the
- Xstring. A value of -2 would end the extraction trimming the last two
- Xcharacters from the string.
- X.SH EXAMPLES
- XTo force an update of all SCCS files open for editing in the current
- Xdirectory, and display a list of changes to the user.
- X.in +.5i
- X.nf
- Xfor pname in p.*
- Xdo
- X name=`substr $pname 3 0`
- X get -p -k s.$name | diff - $name
- X delta s.$name
- Xdone
- X.fi
- X.in -.5i
- X.SS Table of examples
- X.TS
- Xbox;
- Xl c c l, l n n l.
- Xstart 1st col width extracted
- Xstring argument argument characters
- X_
- X123456 1 4 1234
- X123456 3 2 34
- X123456 2 0 23456
- X123456 2 -2 234
- X123456 -3 1 4
- X123456 -4 0 3456
- X.TE
- X.SH WARNINGS
- XNo error messages are produced, but the status returned is non-zero if
- Xthe operation fails. Having the length requested greater than the
- Xcharacters available is not an error.
- X.SH LIMITATION
- XThe usage of negative numbers for the starting character and length
- Xis not consistant. This was done so that "-2" for a start could mean use
- Xthe last two characters, and "-2" for a length would strip the last two
- Xcharacters.
- X.SH AUTHOR
- XBill Davidsen, GE Corporate R&D Center, davidsen@crdos1.uucp
- X'\" For more details, see man(7), as well as man(1), manroff(1), and mmt(1)
- E!O!F
- newsize=`wc -c < substr.1`
- if [ $newsize -ne 2100 ]
- then echo "File substr.1 was $newsize bytes, 2100 expected"
- fi
- exit 0
-
- --
- bill davidsen (wedu@ge-crd.arpa)
- {uunet | philabs | seismo}!steinmetz!crdos1!davidsen
- "Stupidity, like virtue, is its own reward" -me
-