# C-runtime-library **Repository Path**: huang_zhenwei/c-runtime-library ## Basic Information - **Project Name**: C-runtime-library - **Description**: A cross platform library support for C runtime. 为C提供运行时环境的跨平台运行库 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2021-09-21 - **Last Updated**: 2022-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C-runtime-library C运行库 A cross platform library support for C runtime. 为C提供运行时环境的迷你运行库。 代码具备良好的跨平台能力,可在64位,32位的 `Windows` 以及 `Linux` 上编译成运行库。 I/O部分采用了缓冲,实现了高效的输入输出。 本项目已经编写好了编译脚本,在 `Windows` 平台运行 `windows.bat` 编译,在 `Linux` 平台运行 `linux.sh` 编译。 在main.cpp里测试运行时环境。 下面是整个库的接口 ``` cpp //---------------------------------------------------------- // C Run Time Library Head // // It contains all constant definitions, // macro definitions and function declarations // required to use the CRT. // //----------------------------------------------------------- #ifndef CRT_H #define CRT_H #ifdef __cplusplus extern "C"{ #endif #ifdef WIN32 #include #endif //stddef.h #ifndef NULL #define NULL (0) #endif #ifdef __linux #if (__SIZEOF_POINTER__ == 4) typedef unsigned int size_t; #else typedef unsigned long int size_t; #endif #endif #if defined(WIN32) || (__SIZEOF_POINTER__==4) typedef int ssize_t; #else typedef long long int ssize_t; #endif #define EOF (-1) //entry.h void exit(int); //string.h int strcmp(const char*,const char*); char* strcpy(char*,const char*); char* strcat(char*,const char*); unsigned strlen(const char *); char* itoa(int,char*,int); int ftoa(char*,float,int); void* memset(void*,int,size_t ); void* _memcpy(void*,void*,size_t); //heap.h void free(void*); void* malloc(size_t); int crt_heap_init(); //stdio.h #define BUFFSIZE 512 //FILE MODE #define FILE_READ 0 #define FILE_WRITE 1 #define FILE_RDWR 2 //BUFFER MODE #define BUFF_LINE 0 #define BUFF_FULL 1 #define BUFF_NO 2 typedef struct io_file{ int mode; //file mode: read,write,all int buffmode; //buffer mode; int flags; //flie flags int access; //file access #ifdef WIN32 HANDLE file; //file description or handle #else int file; //file description or handle #endif struct io_file* next; //next FILE struct io_file* prev; //prev FILE size_t buffsize; //buffer size char* read_base; //read buffer base pointer char* read_ptr; //reading pointer int read_cnt; //read buffer left char* write_base; //write buffer base pointer char* write_ptr; //writing pointer int write_cnt; //write buffer left } FILE; FILE* _buitin_file_func(int); #define stdin (_buitin_file_func(0)) #define stdout (_buitin_file_func(1)) #define stderr (_buitin_file_func(2)) #ifdef __linux #define O_RDONLY 00 #define O_WRONLY 01 #define O_RDWR 02 #define O_CREAT 0100 #define O_TRUNC 01000 #define O_APPEND 02000 #if __SIZEOF_POINTER__ == 4 //32bit variable argmuent typedef char* va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 ) #elif __SIZEOF_POINTER__ == 8 //64bit variable argmuent typedef struct __va_list_tag{ unsigned int gp_offset; unsigned int fp_offset; void *overflow_arg_area; void *reg_save_area; } va_list; #define va_start(ap,v) do{ \ void *rbp=0; \ asm("movq %%rbp,%0 \n":"=r"(rbp)); \ ap.overflow_arg_area=(char*)rbp; \ ap.reg_save_area=(char*)&v+40; \ ap.fp_offset=0; \ ap.gp_offset=0; \ }while(0) #define va_arg(ap,t) \ ((ap.gp_offset<48)? \ (ap.gp_offset+=8, \ *(t*)((char*)ap.reg_save_area+ap.gp_offset))\ :(((char*)ap.overflow_arg_area), \ *(t*)ap.overflow_arg_area)) #define va_end(ap) \ (ap.gp_offset=0, \ ap.fp_offset=0, \ ap.overflow_arg_area=0, \ ap.reg_save_area=0 ) #endif #endif int crt_io_init(); int crt_io_fini(); FILE* fopen(const char*,const char*); size_t fwrite(const void*,size_t,size_t,FILE*); size_t fread(void *,size_t,size_t,FILE*); int fclose(FILE*); int fseek(FILE*,int,int); int fflush(FILE*); int fputc(int,FILE*); int fputs(const char *,FILE*); int fgetc(FILE*); char* fgets(char*,int,FILE*); int putchar(int); int puts(const char *); int getchar(); char* gets(char*); int vprintf(FILE*,const char*,va_list); int printf(const char*, ...); int fprintf(FILE*,const char*, ...); #ifdef __cplusplus } #endif #endif //CRT_H ```