source: trunk/libs/mini-libc/stdlib.c @ 455

Last change on this file since 455 was 445, checked in by alain, 6 years ago

Restructure the mini_libc.

File size: 4.4 KB
RevLine 
[439]1/*
[445]2 * stdlib.c - User level <stdlib> library implementation.
[439]3 *
4 * Author     Alain Greiner (2016,2017)
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
[444]24#include <stdlib.h>
[445]25#include <hal_types.h>
26#include <hal_user.h>
27#include <almosmkh.h>
[439]28#include <stdio.h>
[444]29#include <syscalls_numbers.h>
[439]30
31//////////////////////////
32int atoi(const char * str)
33{
34    int res  = 0;      // Initialize result
35    int sign = 1;      // Initialize sign as positive
36    int i    = 0;      // Initialize index of first digit
37
38    if( (str[0] == '0') && ((str[1] == 'x') || (str[1] == 'X')) )   // hexa
39    {
40        i = 2;
41
42        while( str[i] != 0 )
43        {
44            if     ( (str[i] >= '0') && (str[i] <= '9') ) res = (res<<4) + (str[i] - '0');
45            else if( (str[i] >= 'A') && (str[i] <= 'F') ) res = (res<<4) + (str[i] - 'A');
46            else if( (str[i] >= 'a') && (str[i] <= 'f') ) res = (res<<4) + (str[i] - 'a');
47            else return 0;
48            i++;
49        }
50    }
51    else                                                            // decimal
52    {
53        if (str[0] == '-')  //  number is negative, update sign
54        {
55            sign = -1; 
56            i++;           // Also update index of first digit
57        }
58
59        while( str[i] != 0 )
60        {
61            if( (str[i] >= '0') && (str[i] <= '9') ) res = (res*10) + (str[i] - '0');
62            else return 0;
63            i++;
64        }
65    }
66
67    // Return result with sign
68    return sign*res;
69}
70
71////////////////////////////
72double atof(const char *str)
73{
74    const char *pstr = str;
75    double res = 0;
76    double exp = 0.1;
77    short sign = 1;
78    short dec = 0;
79
80    while (*pstr != '\0')
81    {
82        if (*pstr == '-')
83        {
84            if (str != pstr) break;
85            sign = -1;
86        }
87       
88        else if (*pstr == '.')
89        {
90            if (dec) break;
91            dec = 1;
92        }
93       
94        else if (*pstr >= '0' && *pstr <= '9')
95        {
96            if (dec)
97            {
98                res = res + ((*pstr - '0')*exp);
99                exp = exp / 10;
100            }
101            else
102            {
103                res = (res * 10) + (*pstr - '0');
104            }
105        }
106       
107        else
108        {
109            break;
110        }
111        pstr++;
112    }
113    return sign * res;
114}
115
[444]116//////////
117int rand()
[439]118{
[444]119    unsigned long long cycle;
[439]120
[444]121    get_cycle( &cycle );
[439]122
[444]123    unsigned int x = (unsigned int)cycle;
[439]124
[444]125    if ((x & 0xF) > 7) 
[439]126    {
[444]127        return (x*x & 0xFFFF);
[439]128    }
129    else 
130    {
[444]131        return (x*x*x & 0xFFFF);
[439]132    }
133}
134
[444]135///////////////////////////////
136void srand( unsigned int seed )
[439]137{
[444]138    printf("\n[ERROR] in %s : not implemented yet : do nothing\n", __FUNCTION__ );
[439]139}
140
[444]141//////////////////////////////////
142void * malloc( unsigned int size )
[439]143{
[444]144    // get cluster identifier
145    unsigned int cxy;
146    unsigned int lid;
147    get_core( &cxy , &lid );
[439]148
[444]149    return remote_malloc( size, cxy );
150} 
[439]151
[444]152///////////////////////////////////
153void * calloc ( unsigned int count,
154                unsigned int size )
155{
156    // get calling core cluster identifier
157    unsigned int cxy;
158    unsigned int lid;
159    get_core( &cxy , &lid );
[439]160
[444]161    return remote_calloc( count , size , cxy );
162}
[439]163
[444]164///////////////////////////////////
165void * realloc ( void        * ptr,
166                 unsigned int  size )
[439]167{
[444]168    // get calling core cluster identifier
169    unsigned int cxy;
170    unsigned int lid;
171    get_core( &cxy , &lid );
[439]172
[444]173    return remote_realloc( ptr , size , cxy );
[439]174}
175
[444]176///////////////////////
177void free( void * ptr )
[439]178{
[444]179    // get calling core cluster identifier
180    unsigned int cxy;
181    unsigned int lid;
182    get_core( &cxy , &lid );
[439]183
[444]184    remote_free( ptr , cxy );
[439]185}
186
[444]187///////////////////////
188void exit( int status )
[439]189{
[444]190    hal_user_syscall( SYS_EXIT,
191                      (reg_t)status, 0, 0, 0 );
[439]192}
[443]193
194
Note: See TracBrowser for help on using the repository browser.