Update GCC and binutils to latest versions
[helenos.git] / uspace / app / sbi / src / os / helenos.c
blobb52c21f91bb622b6392aabed2a520ebcb11432a3
1 /*
2 * Copyright (c) 2010 Jiri Svoboda
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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. */
31 #include <assert.h>
32 #include <errno.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <str.h>
36 #include <task.h>
37 #include <tinput.h>
38 #include <str_error.h>
40 #include "os.h"
42 /** Path to executable file via which we have been invoked. */
43 static char *ef_path;
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)
59 int a_size, b_size;
60 char *str;
62 a_size = str_size(a);
63 b_size = str_size(b);
65 str = malloc(a_size + b_size + 1);
66 if (str == NULL) {
67 printf("Memory allocation error.\n");
68 exit(1);
71 memcpy(str, a, a_size);
72 memcpy(str + a_size, b, b_size);
73 str[a_size + b_size] = '\0';
75 return str;
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.
84 * @param str String
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)
92 char *slice;
93 size_t offset;
94 size_t i;
95 size_t size;
96 char32_t c;
98 assert(start + length <= str_length(str));
100 offset = 0;
101 for (i = 0; i < start; ++i) {
102 c = str_decode(str, &offset, STR_NO_LIMIT);
103 assert(c != '\0');
104 assert(c != U_SPECIAL);
105 (void) c;
108 size = str_lsize(str, length);
109 slice = str_ndup(str + offset, size);
111 return slice;
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.
127 * @param str 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.
137 * @param str String
138 * @return New string, duplicate of @a str.
140 char *os_str_dup(const char *str)
142 return str_dup(str);
145 /** Get character from string at the given index.
147 * @param str String
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)
155 size_t offset;
156 int i;
157 char32_t c = 0;
159 if (index < 0)
160 return EINVAL;
162 offset = 0;
163 for (i = 0; i <= index; ++i) {
164 c = str_decode(str, &offset, STR_NO_LIMIT);
165 if (c == '\0')
166 return EINVAL;
167 if (c == U_SPECIAL)
168 return EIO;
171 *out_char = (int) c;
172 return EOK;
175 /** Convert character to new string.
177 * @param chr Character
178 * @return Newly allocated string.
180 char *os_chr_to_astr(char32_t chr)
182 char *str;
183 size_t offset;
185 str = malloc(STR_BOUNDS(1) + 1);
186 if (str == NULL) {
187 printf("Memory allocation error.\n");
188 exit(1);
191 offset = 0;
192 if (chr_encode(chr, str, &offset, STR_BOUNDS(1)) != EOK) {
193 /* XXX Should handle gracefully */
194 printf("String conversion error.\n");
195 exit(1);
198 str[offset] = '\0';
199 return str;
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)
214 char *line;
215 errno_t rc;
217 if (tinput == NULL) {
218 tinput = tinput_new();
219 if (tinput == NULL)
220 return EIO;
222 tinput_set_prompt(tinput, prompt);
225 rc = tinput_read(tinput, &line);
226 if (rc == ENOENT) {
227 /* User-requested abort */
228 *ptr = os_str_dup("");
229 return EOK;
232 if (rc != EOK) {
233 /* Error in communication with console */
234 return EIO;
237 /* XXX Input module needs trailing newline to keep going. */
238 *ptr = os_str_acat(line, "\n");
239 free(line);
241 return EOK;
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[])
251 task_id_t tid;
252 task_wait_t twait;
253 task_exit_t texit;
254 errno_t rc;
255 int retval;
257 rc = task_spawnv(&tid, &twait, cmd[0], (char const *const *) cmd);
258 if (rc != EOK) {
259 printf("Error: Failed spawning '%s' (%s).\n", cmd[0],
260 str_error(rc));
261 exit(1);
264 /* XXX Handle exit status and return value. */
265 rc = task_wait(&twait, &texit, &retval);
266 (void) rc;
268 return EOK;
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)
277 ef_path = 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");