revert between 56095 -> 55830 in arch
[AROS.git] / arch / ppc-sam440 / boot / parthenope / src / support.c
blob0f1f6b166ef3f6757af2da0c05fba900d013efcf
1 #include "context.h"
2 #include "support.h"
4 int strlen(const char *str)
6 int len = 0;
7 while (*str++)
8 len++;
9 return len;
12 int isblank(char c)
14 return (c == ' ' || c == '\t');
17 int isspace(char c)
19 return (c == ' ' || c == '\t' || c == '\f' || c == '\n' || c == '\r'
20 || c == '\v');
23 int isdigit(char c)
25 return (c >= '0' && c <= '9');
28 int tolower(char c)
30 if (c >= 'A' && c <= 'Z')
31 c -= ('A' - 'a');
33 return c;
36 int strncasecmp(const char *s1, const char *s2, int max)
38 int diff = 0;
39 for (; max && !(diff = tolower(*s2) - tolower(*s1)) && *s1;
40 max--, s1++, s2++) ;
41 return diff;
44 int strcasecmp(const char *s1, const char *s2)
46 int diff = 0;
47 for (; !(diff = tolower(*s2) - tolower(*s1)) && *s1; s1++, s2++) ;
48 return diff;
51 int strncmp(const char *s1, const char *s2, int max)
53 int diff = 0;
54 for (; max && !(diff = *s2 - *s1) && *s1; max--, s1++, s2++) ;
55 return diff;
58 int strcmp(const char *s1, const char *s2)
60 int diff = 0;
61 for (; !(diff = *s2 - *s1) && *s1; s1++, s2++) ;
62 return diff;
65 void bzero(void *dest, int length)
67 char *d = dest;
69 while (length--)
70 *d++ = 0;
73 char *strcpy(char *dest, const char *src)
75 return (char *)memmove(dest, src, strlen(src) + 1);
79 char *strncpy(char *dest, const char *src, int n)
81 return (char *)memmove(dest, src, n);
84 int StackSwap(struct StackSwapStruct *sss)
86 register uint32_t real_sp asm("r1");
87 uint32_t *sp;
88 uint32_t *src;
89 uint32_t *dst;
91 asm volatile ("wrteei 0");
93 /* Get the real stack pointer */
94 asm volatile ("mr %0,%1":"=r" (sp):"r"(real_sp));
96 /* Go one stack frame upper - now src points to the stackframe of caller */
97 src = (uint32_t *) * sp;
99 /* Go one more stack frame up. Now you may copy from src to dst (src - sp) IPTR's */
100 src = (uint32_t *) * src;
102 /* If no StackSwapStruct is given, return the "reserved" area behind the stk_Pointer */
103 if (!sss)
104 return (src - sp) * sizeof(uint32_t);
106 dst = sss->stk_Pointer;
108 /* Rewind the dst pointer too. */
109 dst += (src - sp);
111 /* Copy the two stack frames */
112 while (src != sp) {
113 *--dst = *--src;
116 sss->stk_Pointer = sp;
118 asm volatile ("mr %0,%1"::"r" (real_sp), "r"(dst));
120 asm volatile ("wrteei 1");
122 return 0;
125 void *calloc(int size, int n)
127 return malloc(size * n);
130 void *memcpy(void *dest, const void *src, int n)
132 return memmove(dest, src, n);
135 void *memset(void *dest, int c, int n)
137 char *ptr = (char *)dest;
139 while (n-- > 0)
140 *ptr++ = c;
141 return dest;
144 char *strchr(char *s, int c)
146 char *sptr;
147 for (sptr = s; *sptr != 0 && *sptr != c; sptr++) ;
148 if (*sptr == 0)
149 return NULL;
150 return sptr;
153 char *strdup(const char *s)
155 char *dup;
156 dup = malloc(strlen(s) + 1);
157 strcpy(dup, s);
158 return dup;
161 int strtol(const char *s)
163 int l, i, m;
164 l = 0;
165 for (i = strlen(s) - 1, m = 1; i >= 0; i--, m *= 10) {
166 l += (s[i] - 48) * m;
168 return l;
171 list_t *list_new(void)
173 list_t *self;
175 self = malloc(sizeof(list_t));
177 self->l_head = (node_t *) & self->l_tail;
178 self->l_tail = NULL;
179 self->l_tailpred = (node_t *) & self->l_head;
181 return self;
184 void list_append(list_t * self, node_t * node)
186 node->n_succ = (node_t *) & self->l_tail;
187 node->n_pred = self->l_tailpred;
188 node->n_pred->n_succ = node;
189 self->l_tailpred = node;