historical/m0-applesillicon.git/xnu-qemu-arm64-5.1.0/roms/openbios/libc/misc.c

145 lines
2.7 KiB
C
Raw Normal View History

2024-01-16 11:20:27 -06:00
/*
* Creation Date: <2002/10/19 21:05:07 samuel>
* Time-stamp: <2002/10/22 22:29:18 samuel>
*
* <misc.c>
*
* Miscellaneous
*
* Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#include "config.h"
#include "libc/string.h"
int errno_int;
void
qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) )
{
unsigned int worked, i, j;
/* even more inefficient than the glibc variant :-) */
do {
char *p = base;
worked = 0;
for( i=0; i<nmemb-1; i++, p+= size ) {
if( compar( p, p + size ) > 0 ) {
worked = 1;
for( j=0; j<size; j++ ) {
char ch = p[j];
p[j] = p[j+size];
p[j+size] = ch;
}
}
}
} while( worked );
}
long int
strtol( const char *nptr, char **endptr, int base )
{
int sum, n, sign=1;
while( isspace(*nptr) )
nptr++;
if( *nptr == '-' || *nptr == '+' )
sign = (*nptr++ == '-') ? -1 : 1;
if( base == 16 || base == 0) {
if( !base )
base = (nptr[0] == '0')? 8 : 10;
if( nptr[0] == '0' && nptr[1] == 'x' ) {
nptr += 2;
base = 16;
}
}
for( sum=0 ;; nptr++ ) {
char ch = *nptr;
if( !isalnum(ch) )
break;
n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
if( n >= base || n < 0 )
break;
sum *= base;
sum += n;
}
if( endptr )
*endptr = (char*)nptr;
return sum * sign;
}
long long int
strtoll( const char *nptr, char **endptr, int base )
{
long long int sum;
int n, sign=1;
while( isspace(*nptr) )
nptr++;
if( *nptr == '-' || *nptr == '+' )
sign = (*nptr++ == '-') ? -1 : 1;
if( base == 16 || base == 0) {
if( !base )
base = (nptr[0] == '0')? 8 : 10;
if( nptr[0] == '0' && nptr[1] == 'x' ) {
nptr += 2;
base = 16;
}
}
for( sum=0 ;; nptr++ ) {
char ch = *nptr;
if( !isalnum(ch) )
break;
n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
if( n >= base || n < 0 )
break;
sum *= base;
sum += n;
}
if( endptr )
*endptr = (char*)nptr;
return sum * sign;
}
// Propolice support
long __guard[8] = {
#ifdef CONFIG_BIG_ENDIAN
(0 << 24) | (0 << 16) | ('\n' << 8) | 255,
#else
(255 << 24) | ('\n' << 16) | (0 << 8) | 0,
#endif
0, 0, 0, 0, 0, 0, 0
};
static void freeze(void)
{
// Freeze
// XXX: Disable interrupts?
for(;;)
;
}
void __stack_smash_handler(const char *func, int damaged)
{
printk("Propolice detected a stack smashing attack %x at function %s,"
" freezing\n", damaged, func);
freeze();
}
void __stack_chk_fail(void)
{
printk("Propolice detected a stack smashing attack, freezing\n");
freeze();
}