- 论坛徽章:
- 1
|
本帖最后由 jeppeter 于 2016-12-05 08:49 编辑
- #include <stdio.h>
- #include <stdarg.h>
- #include <stdlib.h>
- #include <string.h>
- void debug_buffer(const char* file, int lineno, void* pbuffer, int bufsize, const char* fmt, ...)
- {
- va_list ap;
- int i;
- unsigned char* ptr;
- fprintf(stderr, "%s:%d buffer(%p) size(%d)", file, lineno, pbuffer, bufsize);
- if (fmt) {
- fprintf(stderr, " " );
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- }
- ptr = (unsigned char*)pbuffer;
- for (i = 0; i < bufsize; i++) {
- if ((i % 16) == 0) {
- fprintf(stderr, "\n0x%08x",i );
- }
- fprintf(stderr, " 0x%02x",ptr[i] );
- }
- fprintf(stderr, "\n");
- fflush(stderr);
- return;
- }
- #define DEBUG_BUFFER(ptr,size,...) do{debug_buffer(__FILE__,__LINE__,ptr,size,__VA_ARGS__);}while(0)
- int simple_assertv(const char* file, int lineno, const char* resultstr, const char* fmt, va_list ap)
- {
- va_list oldap;
- char* fmtstr = NULL;
- int fmtsize = 32;
- int ret = 0;
- memset(&oldap,0,sizeof(oldap));
- memcpy(&oldap, ap, sizeof(oldap));
- //DEBUG_BUFFER(&oldap,sizeof(oldap),"oldap pointer");
- //DEBUG_BUFFER(ap,sizeof(oldap),"ap pointer");
- fprintf(stderr, "fmt (%s)(", fmt);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ")\n");
- fflush(stderr);
- try_again:
- memcpy(ap, &oldap, sizeof(oldap));
- //DEBUG_BUFFER(ap,sizeof(oldap),"newap pointer");
- if (fmtstr) {
- free(fmtstr);
- }
- fmtstr = NULL;
- fmtstr = (char*)malloc(fmtsize);
- if (fmtstr == NULL) {
- fprintf(stderr, "%s:%d can not alloc(%d)\n", file, lineno, fmtsize);
- abort();
- }
- ret = vsnprintf(fmtstr, fmtsize - 10, fmt, ap);
- if (ret < 0 || ret >= (fmtsize - 10)) {
- fprintf(stderr, "expand size %d => %d\n", fmtsize, fmtsize << 1);
- fmtsize <<= 1;
- goto try_again;
- }
- va_end(ap);
- ret = strcmp(resultstr, fmtstr);
- if (ret != 0) {
- fprintf(stderr, "%s:%d (%s) != (%s)\n", file, lineno, resultstr, fmtstr);
- abort();
- }
- if (fmtstr) {
- free(fmtstr);
- }
- fmtstr = NULL;
- fmtsize = 0;
- return 0;
- }
- int simple_assert(const char* file, int lineno, const char* resultstr, const char* fmt, ...)
- {
- va_list ap;
- if (fmt) {
- va_start(ap, fmt);
- }
- //DEBUG_BUFFER(ap,sizeof(ap),"initliaze ap");
- return simple_assertv(file, lineno, resultstr, fmt, ap);
- }
- #define SIMPLE_ASSERT(res,...) simple_assert(__FILE__,__LINE__,res,__VA_ARGS__)
- int main(void)
- {
- SIMPLE_ASSERT("to display this help information", "%s %s", "to display", "this help information");
- return 0;
- }
复制代码
回复 3# ljmmail
谢谢你的回复,你的方法是可以,但因为如果真的就是输入一个ap,那就需要保留这个值,我自己调整了一下,使用memcpy保留值,可以不改变参数输入的情况下,使代码不出现问题。
|
|