compat.c
来自「磁盘格式解读」· C语言 代码 · 共 399 行
C
399 行
/* * AUTHOR * N. Nielsen * * LICENSE * This software is in the public domain. * * The software is provided "as is", without warranty of any kind, * express or implied, including but not limited to the warranties * of merchantability, fitness for a particular purpose, and * noninfringement. In no event shall the author(s) be liable for any * claim, damages, or other liability, whether in an action of * contract, tort, or otherwise, arising from, out of, or in connection * with the software or the use or other dealings in the software. * * SUPPORT * Send bug reports to: <nielsen@memberwebs.com> */#include "compat.h"#include "usuals.h"/* * We need to get a better check for this one. * Basically have to make a variable __progname if none * exist */#ifndef HAVE_UNISTD_Hchar* __progname = 0;char prognamebuf[256];void fixprogname(){ if(__progname == 0) { const char* beg = strrchr(_pgmptr, '\\'); const char* temp = strrchr(_pgmptr, '/'); beg = (beg > temp) ? beg : temp; beg = (beg) ? beg + 1 : _pgmptr; temp = strrchr(_pgmptr, '.'); temp = (temp > beg) ? temp : _pgmptr + strlen(_pgmptr); if((temp - beg) > 255) temp = beg + 255; strncpy(prognamebuf, beg, temp - beg); prognamebuf[temp - beg] = 0; __progname = prognamebuf; }}#endif#ifndef HAVE_GETOPTint opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */char* optarg;#define BADCH (int)'?'#define BADARG (int)':'#define EMSG ""/* * getopt -- * Parse argc/argv argument vector. */int getopt(int nargc, char* const* nargv, const char* ostr){ static char* place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ fixprogname(); if(optreset || !*place) /* update scanning pointer */ { optreset = 0; if(optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return (-1); } if (place[1] && *++place == '-') /* found "--" */ { ++optind; place = EMSG; return (-1); } } /* option letter okay? */ if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { /* * if the user didn't specify '-' as an option, * assume it means -1. */ if(optopt == (int)'-') return (-1); if(!*place) ++optind; if(opterr && *ostr != ':' && optopt != BADCH) (void)fprintf(stderr, "%s: illegal option -- %c\n", __progname, optopt); return(BADCH); } if (*++oli != ':') /* don't need argument */ { optarg = NULL; if(!*place) ++optind; } else /* need an argument */ { if (*place) /* no white space */ optarg = place; else if (nargc <= ++optind) /* no arg */ { place = EMSG; if (*ostr == ':') return (BADARG); if(opterr) (void)fprintf(stderr, "%s: option requires an argument -- %c\n", __progname, optopt); return(BADCH); } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } return (optopt); /* dump back option letter */}#endif#ifndef HAVE_ERR_H#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>static FILE *err_file; /* file to use for error output */static void (*err_exit)(int);/* * This is declared to take a `void *' so that the caller is not required * to include <stdio.h> first. However, it is really a `FILE *', and the * manual page documents it as such. */void err_set_file(void *fp){ if (fp) err_file = fp; else err_file = stderr;}void err_set_exit(void (*ef)(int)){ err_exit = ef;}void err(int eval, const char *fmt, ...){ va_list ap; va_start(ap, fmt); verrc(eval, errno, fmt, ap); va_end(ap);}void verr(int eval, const char *fmt, va_list ap){ verrc(eval, errno, fmt, ap);}void errc(int eval, int code, const char *fmt, ...){ va_list ap; va_start(ap, fmt); verrc(eval, code, fmt, ap); va_end(ap);}void verrc(int eval, int code, const char *fmt, va_list ap){ fixprogname(); if (err_file == 0) err_set_file((FILE *)0); fprintf(err_file, "%s: ", __progname); if (fmt != NULL) { vfprintf(err_file, fmt, ap); fprintf(err_file, ": "); } fprintf(err_file, "%s\n", strerror(code)); if (err_exit) err_exit(eval); exit(eval);}void errx(int eval, const char *fmt, ...){ va_list ap; va_start(ap, fmt); verrx(eval, fmt, ap); va_end(ap);}void verrx(int eval, const char *fmt, va_list ap){ fixprogname(); if (err_file == 0) err_set_file((FILE *)0); fprintf(err_file, "%s: ", __progname); if (fmt != NULL) vfprintf(err_file, fmt, ap); fprintf(err_file, "\n"); if (err_exit) err_exit(eval); exit(eval);}void warn(const char *fmt, ...){ va_list ap; va_start(ap, fmt); vwarnc(errno, fmt, ap); va_end(ap);}void vwarn(const char *fmt, va_list ap){ vwarnc(errno, fmt, ap);}void warnc(int code, const char *fmt, ...){ va_list ap; va_start(ap, fmt); vwarnc(code, fmt, ap); va_end(ap);}void vwarnc(int code, const char *fmt, va_list ap){ fixprogname(); if (err_file == 0) err_set_file((FILE *)0); fprintf(err_file, "%s: ", __progname); if (fmt != NULL) { vfprintf(err_file, fmt, ap); fprintf(err_file, ": "); } fprintf(err_file, "%s\n", strerror(code));}void warnx(const char *fmt, ...){ va_list ap; va_start(ap, fmt); vwarnx(fmt, ap); va_end(ap);}void vwarnx(const char *fmt, va_list ap){ fixprogname(); if(err_file == 0) err_set_file((FILE*)0); fprintf(err_file, "%s: ", __progname); if(fmt != NULL) vfprintf(err_file, fmt, ap); fprintf(err_file, "\n");}#endif#ifndef HAVE_REALLOCFvoid* reallocf(void* ptr, size_t size){ void* ret = realloc(ptr, size); if(!ret)
errx(1, "out of memory");
return ret;}#endif
#ifndef HAVE_MALLOCF
void* mallocf(size_t size)
{
void* ret = malloc(size);
if(!ret)
errx(1, "out of memory");
return ret;
}
#endif#ifndef HAVE_ITOWwchar_t* itow(int val, wchar_t* out, int radix){ int mod; wchar_t temp; wchar_t* end = out; wchar_t* beg = out; if(val != 0) { /* If negative and decimal*/ if(radix == 10 && val < 0) *beg++ = L'-'; /* Convert in reverse order */ while(val != 0) { mod = val % radix; val = val / radix; *end++ = (mod < 10) ? L'0' + mod : L'a' + mod - 10; } *end-- = 0; /* Reverse output string */ while(end > beg) { temp = *end; *end = *beg; *beg = temp; ++beg; --end; } } else { beg[0] = L'0'; beg[1] = 0; } return out;}#endif#ifndef HAVE_ITOAchar* itoa(int val, char* out, int radix){ int mod; char temp; char* end = out; char* beg = out; if(val != 0) { /* If negative and decimal*/ if(radix == 10 && val < 0) *beg++ = '-'; /* Convert in reverse order */ while(val != 0) { mod = val % radix; val = val / radix; *end++ = (mod < 10) ? '0' + mod : 'a' + mod - 10; } *end-- = 0; /* Reverse output string */ while(end > beg) { temp = *end; *end = *beg; *beg = temp; ++beg; --end; } } else { beg[0] = '0'; beg[1] = 0; } return out;}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?