forked from KolibriOS/kolibrios
small polish, samples
git-svn-id: svn://kolibrios.org@6443 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -90,6 +90,13 @@ int vprintf ( const char * format, va_list arg );
|
||||
int vsprintf (char * s, const char * format, va_list arg );
|
||||
int vfprintf ( FILE * stream, const char * format, va_list arg );
|
||||
|
||||
|
||||
int tiny_sprintf (char * s, const char * format, ... );
|
||||
int tiny_snprintf (char * s, size_t n, const char * format, ... );
|
||||
int tiny_vsnprintf (char * s, size_t n, const char * format, va_list args );
|
||||
// support %c, %s, %d, %x, %u, %% for 32-bit values only. no width specs, left align
|
||||
// always zero-ended
|
||||
|
||||
extern int errno;
|
||||
/* errors codes from KOS, but minus */
|
||||
#ifndef E_SUCCESS
|
||||
|
@@ -12,8 +12,8 @@
|
||||
|
||||
extern int atoib(char *s,int b);
|
||||
extern int atoi(char *s);
|
||||
extern char *itoab(int n,char* s,int b);
|
||||
extern char *itoa(int n,char* s);
|
||||
extern char *itoab(unsigned int n,char* s,int b);
|
||||
extern char *__itoa(int n,char* s);
|
||||
|
||||
extern void* stdcall malloc(dword size);
|
||||
extern void stdcall free(void *pointer);
|
||||
@@ -25,6 +25,8 @@ extern void srand (unsigned int seed);
|
||||
double strtod (const char* str, char** endptr);
|
||||
long double strtold (const char* str, char** endptr);
|
||||
float strtof (const char* str, char** endptr);
|
||||
long int strtol (const char* str, char** endptr, int base);
|
||||
#define strtoul(s, ep, b) ((unsigned long int)strtol(s, ep, b))
|
||||
|
||||
void* calloc (size_t num, size_t size);
|
||||
|
||||
@@ -41,5 +43,8 @@ typedef div_t ldiv_t;
|
||||
div_t div (int numer, int denom);
|
||||
#define ldiv(a, b) div(a, b)
|
||||
#define atol(a) atoi(a)
|
||||
#define atof(a) strtod(a, NULL)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -28,9 +28,10 @@ start:
|
||||
|
||||
;DEBUGF ' path "%s"\n params "%s"\n', .path, .params
|
||||
; check for overflow
|
||||
mov al, [path+buf_len-1]
|
||||
or al, [params+buf_len-1]
|
||||
jnz .crash
|
||||
;; that not work
|
||||
; mov al, [path+buf_len-1]
|
||||
; or al, [params+buf_len-1]
|
||||
; jnz .crash
|
||||
; check if path written by OS
|
||||
mov eax, [hparams]
|
||||
test eax, eax
|
||||
@@ -126,13 +127,13 @@ public argc as '__argc'
|
||||
public params as '__argv'
|
||||
public path as '__path'
|
||||
|
||||
section '.bss'
|
||||
section '.bss'
|
||||
buf_len = 0x400
|
||||
max_parameters=0x20
|
||||
argc rd 1
|
||||
argv rd max_parameters
|
||||
path rb buf_len
|
||||
params rb buf_len
|
||||
path rb buf_len
|
||||
params rb buf_len
|
||||
|
||||
;section '.data'
|
||||
;include_debug_strings ; ALWAYS present in data section
|
@@ -47,7 +47,7 @@ int vscanf ( const char * format, va_list arg )
|
||||
return format_scan(NULL, format, arg, &virtual_getc_con, &virtual_ungetc_con);
|
||||
};
|
||||
|
||||
int kos_scanf ( const char * format, ...)
|
||||
int scanf ( const char * format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int n;
|
||||
|
97
programs/develop/ktcc/trunk/libc/stdio/sprintf_tiny.c
Normal file
97
programs/develop/ktcc/trunk/libc/stdio/sprintf_tiny.c
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
function for format output to the string. much lighter than standard sprintf
|
||||
because of lesser formats supported
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
//#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
char* __itoa(int n,char* s);
|
||||
char* itoab(unsigned int n, char* s, int b);
|
||||
|
||||
int tiny_vsnprintf (char * s, size_t n, const char * format, va_list args )
|
||||
// support %c, %s, %d, %x, %u, %% for 32-bit values only. no width specs, left align
|
||||
// always zero-ended
|
||||
{
|
||||
char *fmt, *dest, buf[32];
|
||||
fmt = (char*)format;
|
||||
dest = s; dest[n - 1] = '\0';
|
||||
int arg, len;
|
||||
while (*fmt && (dest - s < n - 1))
|
||||
{
|
||||
if (*fmt != '%')
|
||||
{
|
||||
*dest++ = *fmt++;
|
||||
continue;
|
||||
}
|
||||
if (fmt[1] == '%') // %%
|
||||
{
|
||||
*dest++ = '%';
|
||||
fmt += 2;
|
||||
continue;
|
||||
}
|
||||
arg = va_arg(args, int);
|
||||
len = n - 1 - (dest - s);
|
||||
switch (*++fmt)
|
||||
{
|
||||
case 'c':
|
||||
*dest++ = (char)arg;
|
||||
break;
|
||||
case 's':
|
||||
strncpy(dest, (char*)arg, len);
|
||||
dest = strchr(dest, 0);
|
||||
break;
|
||||
case 'd':
|
||||
__itoa(arg, buf);
|
||||
strncpy(dest, buf, len);
|
||||
dest = strchr(dest, 0);
|
||||
break;
|
||||
case 'x':
|
||||
itoab((unsigned)arg, buf, 16);
|
||||
strncpy(dest, buf, len);
|
||||
dest = strchr(dest, 0);
|
||||
break;
|
||||
case 'u':
|
||||
itoab((unsigned)arg, buf, 10);
|
||||
strncpy(dest, buf, len);
|
||||
dest = strchr(dest, 0);
|
||||
break;
|
||||
default:
|
||||
*dest++ = *fmt;
|
||||
}
|
||||
fmt++;
|
||||
}
|
||||
*dest = '\0';
|
||||
return dest - s;
|
||||
}
|
||||
|
||||
|
||||
int tiny_snprintf (char * s, size_t n, const char * format, ... )
|
||||
{
|
||||
va_list arg;
|
||||
int rc;
|
||||
va_start(arg, format);
|
||||
|
||||
rc = tiny_vsnprintf(s, n, format, arg);
|
||||
|
||||
va_end(arg);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int tiny_sprintf (char * s, const char * format, ... )
|
||||
{
|
||||
va_list arg;
|
||||
int rc;
|
||||
va_start(arg, format);
|
||||
|
||||
rc = tiny_vsnprintf(s, 4096, format, arg);
|
||||
|
||||
va_end(arg);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -4,13 +4,17 @@
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
** itoa(n,s) - Convert n to characters in s
|
||||
** itoa(n,s) - Convert n to characters in s
|
||||
*/
|
||||
char* itoa(int n,char* s)
|
||||
char* __itoa(int n,char* s)
|
||||
{
|
||||
int sign;
|
||||
char *ptr;
|
||||
ptr = s;
|
||||
|
||||
if(n == (int)0x80000000)
|
||||
return strcpy(s, "-2147483648"); // overflowed -n
|
||||
|
||||
if ((sign = n) < 0) n = -n;
|
||||
do {
|
||||
*ptr++ = n % 10 + '0';
|
||||
|
@@ -7,7 +7,7 @@
|
||||
** itoab(n,s,b) - Convert "unsigned" n to characters in s using base b.
|
||||
** NOTE: This is a non-standard function.
|
||||
*/
|
||||
char* itoab(int n,char* s,int b)
|
||||
char* itoab(unsigned int n, char* s, int b)
|
||||
{
|
||||
char *ptr;
|
||||
int lowbit;
|
||||
@@ -15,7 +15,7 @@ char* itoab(int n,char* s,int b)
|
||||
b >>= 1;
|
||||
do {
|
||||
lowbit = n & 1;
|
||||
n = (n >> 1) & 32767;
|
||||
n = (n >> 1) & 0x7FFFFFFF;
|
||||
*ptr = ((n % b) << 1) + lowbit;
|
||||
if(*ptr < 10) *ptr += '0'; else *ptr += 55;
|
||||
++ptr;
|
||||
|
78
programs/develop/ktcc/trunk/libc/stdlib/strtol.c
Normal file
78
programs/develop/ktcc/trunk/libc/stdlib/strtol.c
Normal file
@@ -0,0 +1,78 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define LONG_MIN (-2147483647L-1)
|
||||
#define LONG_MAX (2147483647L)
|
||||
#define ULONG_MAX (4294967295UL)
|
||||
|
||||
|
||||
int getdigit(char ch, int base)
|
||||
{
|
||||
if (isdigit(ch)) ch-= '0';
|
||||
else
|
||||
if (isalpha(ch) && ch <= 'Z') ch = 10 + ch - 'A';
|
||||
else
|
||||
if (isalpha(ch)) ch = 10 + ch - 'a';
|
||||
else
|
||||
return -1;
|
||||
|
||||
if (ch / base != 0) return -1;
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
long int strtol (const char* str, char** endptr, int base)
|
||||
{
|
||||
long int res = 0;
|
||||
int sign = 1;
|
||||
|
||||
if (base > 36)
|
||||
{
|
||||
errno = EINVAL;
|
||||
goto bye;
|
||||
}
|
||||
|
||||
while (isspace(*str)) str++;
|
||||
|
||||
if (*str == '-') { sign = -1; str++; }
|
||||
else
|
||||
if (*str == '+') str++;
|
||||
|
||||
if (base == 0 || base == 16)
|
||||
{
|
||||
if (*str == '0' && (str[1] == 'x' || str[1] == 'X'))
|
||||
{
|
||||
base = 16;
|
||||
str += 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (base == 0 && *str == '0') base = 8;
|
||||
|
||||
if (base == 0) base = 10;
|
||||
|
||||
|
||||
int digit;
|
||||
while ((digit = getdigit(*str, base)) >= 0)
|
||||
{
|
||||
res = base * res + digit;
|
||||
str++;
|
||||
if (res < 0)
|
||||
{
|
||||
errno = ERANGE;
|
||||
if (sign > 0)
|
||||
res = LONG_MAX;
|
||||
else
|
||||
res = LONG_MIN;
|
||||
}
|
||||
}
|
||||
|
||||
bye:
|
||||
if (endptr)
|
||||
*endptr = (char*)str;
|
||||
|
||||
return res * sign;
|
||||
}
|
||||
|
@@ -10,6 +10,8 @@ int memcmp(const void* buf1,const void* buf2,size_t count)
|
||||
return -1;
|
||||
if (*(uc*)buf1>*(uc*)buf2)
|
||||
return 1;
|
||||
(uc*)buf1++;
|
||||
(uc*)buf2++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user