📄 stdlib.h
字号:
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
#ifndef _STDLIB
#define _STDLIB
//---------------------------------------------------------------------------
// Definitions and types
//---------------------------------------------------------------------------
#ifndef RAND_MAX
#define RAND_MAX 32767 // The value of which is the maximum value
// ... returned by the rand function
#endif
typedef struct {
signed int quot;
signed int rem;
} div_t;
typedef struct {
signed long quot;
signed long rem;
} ldiv_t;
#include <stddef.h>
//---------------------------------------------------------------------------
// String conversion functions
//---------------------------------------------------------------------------
/* Standard template: float atof(char * s)
* converts the initial portion of the string s to a float.
* returns the converted value if any, 0 otherwise
*/
float atof(char * s);
/* Standard template: signed int atoi(char * s)
* converts the initial portion of the string s to a signed int
* returns the converted value if any, 0 otherwise
*/
signed int atoi(char *s);
/* Syntax: signed int32 atoi32(char * s)
converts the initial portion of the string s to a signed int32
returns the converted value if any, 0 otherwise*/
signed int32 atoi32(char *s);
/* Standard template: signed long atol(char * s)
* converts the initial portion of the string s to a signed long
* returns the converted value if any, 0 otherwise
*/
signed long atol(char *s);
/* Standard template: float strtol(char * s,char *endptr)
* converts the initial portion of the string s to a float
* returns the converted value if any, 0 otherwise
* the final string is returned in the endptr, if endptr is not null
*/
float strtod(char *s,char *endptr);
/* Standard template: long strtoul(char * s,char *endptr,signed int base)
* converts the initial portion of the string s, represented as an
* integral value of radix base to a signed long.
* Returns the converted value if any, 0 otherwise
* the final string is returned in the endptr, if endptr is not null
*/
signed long strtol(char *s,char *endptr,signed int base);
/* Standard template: long strtoul(char * s,char *endptr,signed int base)
* converts the initial portion of the string s, represented as an
* integral value of radix base to a unsigned long.
* returns the converted value if any, 0 otherwise
* the final string is returned in the endptr, if endptr is not null
*/
long strtoul(char *s,char *endptr,signed int base);
//---------------------------------------------------------------------------
// Pseudo-random sequence generation functions
//---------------------------------------------------------------------------
/* The rand function computes a sequence of pseudo-random integers in
* the range 0 to RAND_MAX
*
* Parameters:
* (none)
*
* Returns:
* The pseudo-random integer
*/
long rand(void);
/* The srand function uses the argument as a seed for a new sequence of
* pseudo-random numbers to be returned by subsequent calls to rand.
*
* Parameters:
* [in] seed: The seed value to start from. You might need to pass
*
* Returns:
* (none)
*
* Remarks
* The srand function sets the starting point for generating
* a series of pseudorandom integers. To reinitialize the
* generator, use 1 as the seed argument. Any other value for
* seed sets the generator to a random starting point. rand
* retrieves the pseudorandom numbers that are generated.
* Calling rand before any call to srand generates the same
* sequence as calling srand with seed passed as 1.
* Usually, you need to pass a time here from outer source
* so that the numbers will be different every time you run.
*/
void srand(unsigned int32 seed);
//---------------------------------------------------------------------------
// Memory management functions
//---------------------------------------------------------------------------
// Comming soon
//---------------------------------------------------------------------------
// Communication with the environment
//---------------------------------------------------------------------------
/* The function returns 0 always
*/
signed int system(char *string);
//---------------------------------------------------------------------------
// Searching and sorting utilities
//---------------------------------------------------------------------------
/* Performs a binary search of a sorted array..
*
* Parameters:
* [in] key: Object to search for
* [in] base: Pointer to base of search data
* [in] num: Number of elements
* [in] width: Width of elements
* [in] compare: Function that compares two elements
*
* Returns:
* bsearch returns a pointer to an occurrence of key in the array pointed
* to by base. If key is not found, the function returns NULL. If the
* array is not in order or contains duplicate records with identical keys,
* the result is unpredictable.
*/
//void *bsearch(const void *key, const void *base, size_t num, size_t width,
// int (*compare)(const void *, const void *));
/* Performs the shell-metzner sort (not the quick sort algorithm). The contents
* of the array are sorted into ascending order according to a comparison
* function pointed to by compar.
*
* Parameters:
* [in] base: Pointer to base of search data
* [in] num: Number of elements
* [in] width: Width of elements
* [in] compare: Function that compares two elements
*
* Returns:
* (none)
*/
//void *qsort(const void *base, size_t num, size_t width,
// int (*compare)(const void *, const void *));
//---------------------------------------------------------------------------
// Integer arithmetic functions
//---------------------------------------------------------------------------
#define labs abs
div_t div(signed int numer,signed int denom);
ldiv_t ldiv(signed long numer,signed long denom);
//---------------------------------------------------------------------------
// Multibyte character functions
//---------------------------------------------------------------------------
// Not supported
//---------------------------------------------------------------------------
// Multibyte string functions
//---------------------------------------------------------------------------
// Not supported
//---------------------------------------------------------------------------
// Internal implementation
//---------------------------------------------------------------------------
#include <stddef.h>
#include <string.h>
div_t div(signed int numer,signed int denom)
{
div_t val;
val.quot = numer / denom;
val.rem = numer - (denom * val.quot);
return (val);
}
ldiv_t ldiv(signed long numer,signed long denom)
{
ldiv_t val;
val.quot = numer / denom;
val.rem = numer - (denom * val.quot);
return (val);
}
float atof(char * s)
{
float pow10 = 1.0;
float result = 0.0;
int sign = 0;
char c;
int ptr = 0;
c = s[ptr++];
if ((c>='0' && c<='9') || c=='+' || c=='-' || c=='.') {
if(c == '-') {
sign = 1;
c = s[ptr++];
}
if(c == '+')
c = s[ptr++];
while((c >= '0' && c <= '9')) {
result = 10*result + c - '0';
c = s[ptr++];
}
if (c == '.') {
c = s[ptr++];
while((c >= '0' && c <= '9')) {
pow10 = pow10*10;
result += (c - '0')/pow10;
c = s[ptr++];
}
}
}
if (sign == 1)
result = -1*result;
return(result);
}
signed int atoi(char *s)
{
signed int result;
int sign, base, index;
char c;
index = 0;
sign = 0;
base = 10;
result = 0;
// Omit all preceeding alpha characters
if(s)
c = s[index++];
// increase index if either positive or negative sign is detected
if (c == '-')
{
sign = 1; // Set the sign to negative
c = s[index++];
}
else if (c == '+')
{
c = s[index++];
}
if (c >= '0' && c <= '9')
{
// Check for hexa number
if (c == '0' && (s[index] == 'x' || s[index] == 'X'))
{
base = 16;
index++;
c = s[index++];
}
// The number is a decimal number
if (base == 10)
{
while (c >= '0' && c <= '9')
{
result = 10*result + (c - '0');
c = s[index++];
}
}
else if (base == 16) // The number is a hexa number
{
c = toupper(c);
while ( (c >= '0' && c <= '9') || (c >= 'A' && c<='F'))
{
if (c >= '0' && c <= '9')
result = (result << 4) + (c - '0');
else
result = (result << 4) + (c - 'A' + 10);
c = s[index++];
c = toupper(c);
}
}
}
if (sign == 1 && base == 10)
result = -result;
return(result);
}
signed long atol(char *s)
{
signed long result;
int sign, base, index;
char c;
index = 0;
sign = 0;
base = 10;
result = 0;
if(s)
c = s[index++];
// increase index if either positive or negative sign is detected
if (c == '-')
{
sign = 1; // Set the sign to negative
c = s[index++];
}
else if (c == '+')
{
c = s[index++];
}
if (c >= '0' && c <= '9')
{
if (c == '0' && (s[index] == 'x' || s[index] == 'X'))
{
base = 16;
index++;
c = s[index++];
}
// The number is a decimal number
if (base == 10)
{
while (c >= '0' && c <= '9')
{
result = 10*result + (c - '0');
c = s[index++];
}
}
else if (base == 16) // The number is a hexa number
{
c = toupper(c);
while ( (c >= '0' && c <= '9') || (c >= 'A' && c <='F'))
{
if (c >= '0' && c <= '9')
result = (result << 4) + (c - '0');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -