2 * Copyright (c) 2010 Jiri Svoboda
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @file HelenOS-specific code. */
38 #include <str_error.h>
42 /** Path to executable file via which we have been invoked. */
46 * Using HelenOS-specific string API.
49 static tinput_t
*tinput
= NULL
;
51 /** Concatenate two strings.
53 * @param a First string
54 * @param b Second string
55 * @return New string, concatenation of @a a and @a b.
57 char *os_str_acat(const char *a
, const char *b
)
65 str
= malloc(a_size
+ b_size
+ 1);
67 printf("Memory allocation error.\n");
71 memcpy(str
, a
, a_size
);
72 memcpy(str
+ a_size
, b
, b_size
);
73 str
[a_size
+ b_size
] = '\0';
78 /** Return slice (substring) of a string.
80 * Copies the specified range of characters from @a str and returns it
81 * as a newly allocated string. @a start + @a length must be less than
82 * or equal to the length of @a str.
85 * @param start Index of first character (starting from zero).
86 * @param length Number of characters to copy.
88 * @return Newly allocated string holding the slice.
90 char *os_str_aslice(const char *str
, size_t start
, size_t length
)
98 assert(start
+ length
<= str_length(str
));
101 for (i
= 0; i
< start
; ++i
) {
102 c
= str_decode(str
, &offset
, STR_NO_LIMIT
);
104 assert(c
!= U_SPECIAL
);
108 size
= str_lsize(str
, length
);
109 slice
= str_ndup(str
+ offset
, size
);
114 /** Compare two strings.
116 * @param a First string
117 * @param b Second string
118 * @return Zero if equal, nonzero if not equal
120 int os_str_cmp(const char *a
, const char *b
)
122 return str_cmp(a
, b
);
125 /** Return number of characters in string.
128 * @return Number of characters in @a str.
130 size_t os_str_length(const char *str
)
132 return str_length(str
);
135 /** Duplicate string.
138 * @return New string, duplicate of @a str.
140 char *os_str_dup(const char *str
)
145 /** Get character from string at the given index.
148 * @param index Character index (starting from zero).
149 * @param out_char Place to store character.
150 * @return EOK on success, EINVAL if index is out of bounds,
151 * EIO on decoding error.
153 errno_t
os_str_get_char(const char *str
, int index
, int *out_char
)
163 for (i
= 0; i
<= index
; ++i
) {
164 c
= str_decode(str
, &offset
, STR_NO_LIMIT
);
175 /** Convert character to new string.
177 * @param chr Character
178 * @return Newly allocated string.
180 char *os_chr_to_astr(char32_t chr
)
185 str
= malloc(STR_BOUNDS(1) + 1);
187 printf("Memory allocation error.\n");
192 if (chr_encode(chr
, str
, &offset
, STR_BOUNDS(1)) != EOK
) {
193 /* XXX Should handle gracefully */
194 printf("String conversion error.\n");
202 /** Display survival help message. */
203 void os_input_disp_help(void)
205 printf("Press Ctrl-Q to quit.\n");
208 /** Read one line of input from the user.
210 * @param ptr Place to store pointer to new string.
212 errno_t
os_input_line(const char *prompt
, char **ptr
)
217 if (tinput
== NULL
) {
218 tinput
= tinput_new();
222 tinput_set_prompt(tinput
, prompt
);
225 rc
= tinput_read(tinput
, &line
);
227 /* User-requested abort */
228 *ptr
= os_str_dup("");
233 /* Error in communication with console */
237 /* XXX Input module needs trailing newline to keep going. */
238 *ptr
= os_str_acat(line
, "\n");
244 /** Simple command execution.
246 * @param cmd Command and arguments (NULL-terminated list of strings.)
247 * Command is present just one, not duplicated.
249 errno_t
os_exec(char *const cmd
[])
257 rc
= task_spawnv(&tid
, &twait
, cmd
[0], (char const *const *) cmd
);
259 printf("Error: Failed spawning '%s' (%s).\n", cmd
[0],
264 /* XXX Handle exit status and return value. */
265 rc
= task_wait(&twait
, &texit
, &retval
);
271 /** Store the executable file path via which we were executed.
273 * @param path Executable path via which we were executed.
275 void os_store_ef_path(char *path
)
280 /** Return path to the Sysel library
282 * @return New string. Caller should deallocate it using @c free().
284 char *os_get_lib_path(void)
286 return os_str_dup("/src/sysel/lib");