📄 stdlib.c
字号:
/* stdlib.c * * (C) Copyright Apr 15 1995, Edmond J. Breen. * ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * */#ifndef NO_STDLIB#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include <signal.h>#include <string.h>#include "eic.h"#include "stdliblocal.h"#include "xalloc.h"void EiC_Mod_Error(char * fmt, ...){ char buff[512]; va_list args; va_start(args,fmt); sprintf(buff,fmt,args); EiC_messageDisplay(buff); va_end(args); raise(SIGSEGV);}/* STDLIB.H STUFF ----------------------------------*/val_t eic_malloc(void){ val_t v; v.p.sp = v.p.p = xmalloc(arg(0,getargs(),size_t)); setEp( v.p, arg(0,getargs(),size_t) ); return v;}val_t eic_calloc(void){ val_t v; arg_list ap = getargs(); size_t s1,s2; s1 = arg(0,ap,size_t); s2 = arg(1,ap,size_t); v.p.sp = v.p.p = xcalloc(s1,s2); setEp( v.p, s1 * s2 ); return v;}val_t eic_realloc(void){ val_t v; arg_list ap = getargs(); v.p.sp = v.p.p = xrealloc(arg(0,ap,ptr_t).p, arg(1,ap,size_t)); setEp( v.p, arg(1,ap,size_t) ); return v;}val_t eic_free(void){ val_t v;#if 0 ptr_t *p; p = arg(0,getargs(),ptr_t*); xfree(p->p); p->p = p->sp = p->ep = NULL; #else ptr_t p; p = arg(0,getargs(),ptr_t); xfree(p.p);#endif return v;}val_t eic_strtod(void){ val_t v; arg_list ap = getargs(); ptr_t p1, *p2; void * endptr; p1 = arg(0,ap,ptr_t); if(arg(1,ap,ptr_t).p) { p2 = arg(1,ap,ptr_t).p; p2->sp = p1.sp; p2->ep = p1.ep; endptr= &p2->p; } else endptr = NULL; v.dval = (float)strtod(p1.p, endptr); return v;}val_t eic_strtol(void){ val_t v; arg_list ap = getargs(); ptr_t p1, *p2; void * endptr; p1 = arg(0,ap,ptr_t); if(arg(1,ap,ptr_t).p) { p2 = arg(1,ap,ptr_t).p; p2->sp = p1.sp; p2->ep = p1.ep; endptr= &p2->p; } else endptr = NULL; v.lval = strtol(p1.p, endptr, arg(2,ap,int)); return v;}val_t eic_strtoul(void){ val_t v; arg_list ap = getargs(); ptr_t p1, *p2; void * endptr; p1 = arg(0,ap,ptr_t); if(arg(1,ap,ptr_t).p) { p2 = arg(1,ap,ptr_t).p; p2->sp = p1.sp; p2->ep = p1.ep; endptr= &p2->p; } else endptr = NULL; v.ulval = strtoul(p1.p, endptr, arg(2,ap,int)); return v;}#ifndef NO_SYSTEMval_t eic_system(void){ val_t v; v.ival = system(nextarg(getargs(),ptr_t).p); return v;}#endifval_t eic_itoa(void){ arg_list ap = getargs(); val_t v; getptrarg(1,v.p); switch(arg(3,ap,int)) { case 1: v.p.sp = v.p.p = itoa(arg(0,ap,int), v.p.p, arg(2,ap,int)); break; case 2: v.p.sp = v.p.p = utoa(arg(0,ap,unsigned), v.p.p, arg(2,ap,int)); } setEp( v.p, strlen(v.p.p) + 1 ); return v;} val_t eic_ltoa(void){ arg_list ap = getargs(); val_t v; getptrarg(1,v.p); switch(arg(3,ap,int)) { case 1: v.p.sp = v.p.p = ltoa(arg(0,ap,long), v.p.p, arg(2,ap,int)); break; case 2: v.p.sp = v.p.p = ultoa(arg(0,ap,unsigned long), v.p.p, arg(2,ap,int)); break; } setEp( v.p, strlen(v.p.p) + 1 ); return v;}#if 0static unsigned long _Rseed = 1;int rand(void){ _Rseed = _Rseed * 1103515245 + 12345; return (unsigned)(_Rseed >> 16) & RAND_MAX;}void srand(unsigned int x){ _Rseed = x;}#endifval_t eic_rand(void){ val_t v; v.ival = rand(); return v;}val_t eic_srand(void){ val_t v; srand(nextarg(getargs(),unsigned int)); return v;}val_t eic_atoi(void){ val_t v; v.ival = atoi(nextarg(getargs(),ptr_t).p); return v;}val_t eic_atol(void){ val_t v; v.lval = atol(nextarg(getargs(),ptr_t).p); return v;}val_t eic_atof(void){ val_t v; v.dval = atof(nextarg(getargs(),ptr_t).p); return v;}#ifndef NO_ENVval_t eic_getenv(void){ val_t v; v.p.sp = v.p.p = getenv(nextarg(getargs(),ptr_t).p); if(v.p.p) setEp( v.p, strlen(v.p.p) + 1 ); else v.p.ep = v.p.p; return v;}val_t eic_putenv(void){ val_t v; v.ival = putenv(nextarg(getargs(),ptr_t).p); return v;}#endifval_t eic_exit(void){ extern int EiC_interActive; /* defined in starteic.c */ val_t v; if(!EiC_interActive) { v.ival = arg(0,getargs(),int); exit(v.ival); }#ifdef WIN32 raise(SIGTERM);#else raise(SIGUSR1);#endif return v;}val_t eic_abort(void){ extern int EiC_interActive; /* defined in starteic.c */ val_t v; if(!EiC_interActive) abort();#ifdef WIN32 raise(SIGTERM);#else raise(SIGUSR1);#endif return v;}#endif/****************************************************************/void module_stdlib(void){#ifndef NO_STDLIB /* stdlib.h */ EiC_add_builtinfunc("system", eic_system); EiC_add_builtinfunc("_itoa", eic_itoa); EiC_add_builtinfunc("_ltoa", eic_ltoa); EiC_add_builtinfunc("malloc", eic_malloc); EiC_add_builtinfunc("calloc", eic_calloc); EiC_add_builtinfunc("realloc", eic_realloc); EiC_add_builtinfunc("free", eic_free); EiC_add_builtinfunc("strtod", eic_strtod); EiC_add_builtinfunc("strtol", eic_strtol); EiC_add_builtinfunc("strtoul", eic_strtoul); EiC_add_builtinfunc("rand", eic_rand); EiC_add_builtinfunc("srand", eic_srand); EiC_add_builtinfunc("atoi", eic_atoi); EiC_add_builtinfunc("atof", eic_atof); EiC_add_builtinfunc("atol", eic_atol);#ifndef NO_ENV EiC_add_builtinfunc("getenv", eic_getenv); EiC_add_builtinfunc("putenv", eic_putenv);#endif EiC_add_builtinfunc("abort",eic_abort); EiC_add_builtinfunc("eic_exit",eic_exit);#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -