small polish, samples

git-svn-id: svn://kolibrios.org@6443 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
siemargl
2016-06-10 11:10:52 +00:00
parent b718363009
commit 3e571bd7cc
15 changed files with 487 additions and 24 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View 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;
}

View File

@@ -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';

View File

@@ -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;

View 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;
}

View File

@@ -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;
}