Initial commit.
[qa-tools:testrunner-lite.git] / src / utils.c
1 /*
2  * This file is part of testrunner-lite
3  *
4  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5  *
6  * Contact: Raimo Gratseff <ext-raimo.gratseff@nokia.com>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  *
22  */
23
24 /* ------------------------------------------------------------------------- */
25 /* INCLUDE FILES */
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <errno.h>
29 #include <string.h>
30
31 /* ------------------------------------------------------------------------- */
32 /* EXTERNAL DATA STRUCTURES */
33 /* None */
34
35 /* ------------------------------------------------------------------------- */
36 /* EXTERNAL GLOBAL VARIABLES */
37 /* None */
38
39 /* ------------------------------------------------------------------------- */
40 /* EXTERNAL FUNCTION PROTOTYPES */
41 /* None */
42
43 /* ------------------------------------------------------------------------- */
44 /* GLOBAL VARIABLES */
45 /* None */
46
47 /* ------------------------------------------------------------------------- */
48 /* CONSTANTS */
49 /* None */
50
51 /* ------------------------------------------------------------------------- */
52 /* MACROS */
53 /* None */
54
55 /* ------------------------------------------------------------------------- */
56 /* LOCAL GLOBAL VARIABLES */
57 /* None */
58
59 /* ------------------------------------------------------------------------- */
60 /* LOCAL CONSTANTS AND MACROS */
61
62 /* Match these to log.h log_message_types */
63 /* None */
64
65 /* ------------------------------------------------------------------------- */
66 /* MODULE DATA STRUCTURES */
67 /* None */
68
69
70 /* ------------------------------------------------------------------------- */
71 /* LOCAL FUNCTION PROTOTYPES */
72 /* ------------------------------------------------------------------------- */
73 /* None */
74
75 /* FORWARD DECLARATIONS */
76 /* None */
77
78 /* ------------------------------------------------------------------------- */
79 /* ==================== LOCAL FUNCTIONS ==================================== */
80 /* ------------------------------------------------------------------------- */
81 /* None */
82
83 /* ------------------------------------------------------------------------- */
84 /* ======================== FUNCTIONS ====================================== */
85 /* ------------------------------------------------------------------------- */ 
86 /** Trim string of whitespace and control characters.
87  * Remove unwanted whitespace, linefeeds etc. (using isspace()) from the
88  * beginning and end of the string (until the first/last non-whitespace
89  * character) and control characters (using iscntrl()) from the middle.
90  * @param ins The input string. Must not be null.
91  * @param outs The output string. Must be at least as long as the input string
92  *        and not null.
93  * @return Length of the output string
94  */
95 unsigned int trim_string (char *ins, char *outs)
96 {
97         unsigned int ins_i = 0;
98         unsigned int ins_end = 0;
99         unsigned int outs_i = 0;
100
101         /* make sure input and output strings exist */
102         if (ins == 0 || outs == 0) {
103                 return 0;
104         }
105
106         ins_end = strlen(ins);
107
108         /* test if the string is empty */
109         if (ins_end == 0) {
110                 return 0;
111         }
112
113         /* find the first non-whitespace character */
114         while (1) {
115                 if (ins_i >= ins_end)
116                         break;
117                 if (isspace(ins[ins_i]))
118                         ins_i += 1;
119                 else
120                         break;
121         }
122
123         /* find the last non-whitespace character */
124         while (1) {
125                 if (ins_end <= ins_i)
126                         break;
127                 if (isspace(ins[ins_end - 1]))
128                         ins_end -= 1;
129                 else
130                         break;
131         }
132
133         /* Copy trimmed string to output */
134         while (ins_i < ins_end) {
135                 /* check and skip control characters */
136                 if (!iscntrl(ins[ins_i])) {
137                         outs[outs_i] = ins[ins_i];
138                         outs_i += 1;
139                 }
140                 ins_i += 1;
141         }
142         /* add null termination */
143         outs[outs_i] = 0;
144
145         return outs_i;
146 }
147
148
149 /* ================= OTHER EXPORTED FUNCTIONS ============================== */
150 /* None */
151
152 /* ------------------------------------------------------------------------- */
153 /* End of file */
154