1 | /***************************************
2 | $Revision: 1.3 $
3 |
4 | string utilities (ut).
5 |
6 | Status: NOT REVUED, NOT TESTED
7 |
8 | ******************/ /******************
9 | Filename : stringutil.c
10 | Author : marek@ripe.net
11 | ******************/ /******************
12 | Copyright (c) 1999 RIPE NCC
13 |
14 | All Rights Reserved
15 |
16 | Permission to use, copy, modify, and distribute this software and its
17 | documentation for any purpose and without fee is hereby granted,
18 | provided that the above copyright notice appear in all copies and that
19 | both that copyright notice and this permission notice appear in
20 | supporting documentation, and that the name of the author not be
21 | used in advertising or publicity pertaining to distribution of the
22 | software without specific, written prior permission.
23 |
24 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
25 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
26 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
27 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
28 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30 | ***************************************/
31 |
32 | #include <string.h>
33 | #include <stdlib.h>
34 | #include <ctype.h>
35 | #include "ut_string.h"
36 |
37 | #define SPACE 0
38 | #define WORD 1
39 |
40 | /*+
41 | compress by removing leading/trailing spaces and compressing multiple
42 | whitespaces to one.
43 |
44 | allocates a string and returns it - it must be freed
45 | +*/
46 |
47 |
48 | /*++++++++++++++++++++++++++++++++++++++
49 | char *
50 | ut_string_compress removes leading/trailing whitespaces and compresses
51 | multiple whitespaces to one. The result is an allocated
52 | string and must be freed.
53 |
54 | char *input source string
55 | ++++++++++++++++++++++++++++++++++++++*/
56 | char *
57 | ut_string_compress(char *input)
58 | {
59 | char *inchr;
60 | char *copy = malloc(strlen(input)+1);
61 | char *outchr = copy;
62 | char *lastchr;
63 | int nowexpected = WORD; /* skip initial spaces */
64 |
65 | /* find trailing space */
66 | lastchr = strchr(input, '\0');
67 | while( lastchr != input ) {
68 | lastchr--;
69 | if( !isspace((int)*lastchr) ) {
70 | break;
71 | }
72 | }
73 |
74 | /* copy the string word by word, inserting spaces */
75 | inchr=input;
76 | do {
77 | unsigned char ch = *inchr;
78 |
79 | if( isspace(ch) ) {
80 | if( nowexpected == WORD ) {
81 | continue; /* skip this whitespace */
82 | }
83 | else {
84 | ch = ' '; /* convert to a plain space */
85 | nowexpected = WORD; /* ignore any more spaces */
86 | }
87 | }
88 | else {
89 | nowexpected = SPACE;
90 | }
91 |
92 | *outchr = ch;
93 | outchr++;
94 | } while(inchr++ != lastchr);
95 |
96 | *outchr = '\0';
97 |
98 | return copy;
99 | }
100 |
101 |
102 | /*++++++++++++++++++++++++++++++++++++++
103 |
104 | void
105 | ut_string_chop removes trailing whitespaces from the string, replacing
106 | them with '\0' characters.
107 | So it modifies the source string.
108 |
109 | char *input source string
110 | ++++++++++++++++++++++++++++++++++++++*/
111 | void
112 | ut_string_chop(char *input)
113 | {
114 | unsigned char *co = (unsigned char *)strchr(input, '\0');
115 |
116 | while( co != (unsigned char *)input && (isspace(*co) || *co == '\0') ) {
117 | *co = '\0';
118 | co--;
119 | }
120 | }
121 |