Source File ut/ut_string.c

    1    | /***************************************
    2    |   $Revision: 1.5 $
    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,2000,2001,2002               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 "rip.h"
    33   | #include <string.h>
    34   | #include <stdlib.h>
    35   | #include <ctype.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 = UT_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  |