댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
일반
2012.02.06 08:12
디버깅용 string 프로그램 소스
조회 수 17454 댓글 0
Practice of Programming 에서 발췌.
바이너리 파일에서 6자 이상의 문자열을 모두 출력해주는 프로그램. /* Copyright (C) 1999 Lucent Technologies */ /* Excerpted from 'The Practice of Programming' */ /* by Brian W. Kernighan and Rob Pike */ #include <stdio.h> #include <ctype.h> #include "eprintf.h" void strings(char *, FILE *); enum { MINLEN = 6 }; /* strings main: find printable strings in files */ int main(int argc, char *argv[]) { int i; FILE *fin; setprogname("strings"); if (argc == 1) eprintf("usage: strings filenames"); else { for (i = 1; i < argc; i++) { if ((fin = fopen(argv[i], "rb")) == NULL) weprintf("can't open %s:", argv[i]); else { strings(argv[i], fin); fclose(fin); } } } return 0; } /* strings: extract printable strings from stream */ void strings(char *name, FILE *fin) { int c, i; char buf[BUFSIZ]; do { /* once for each string */ for (i = 0; (c = getc(fin)) != EOF; ) { if (!isprint(c)) break; buf[i++] = c; if (i >= BUFSIZ) break; } if (i >= MINLEN) /* print if long enough */ printf("%s:%.*s\n", name, i, buf); } while (c != EOF); }
/* eprintf.h: 에러 wrapper 함수 제공 */ extern void eprintf(char *fmt, ...); extern void weprintf(char *fmt, ...); extern char *estrdup(char *s); extern void *emalloc(size_t n); extern void setprogname(char *str); extern char *progname(void);
#include <stdio.h> #include <stdarg.h> #include <string.h> #include <errno.h> #include "eprintf.h"| /* eprintf: 에러 메시지를 출력하고 프로그램을 종료한다. */ void eprintf(char *fmt, ...) { va_list args; fflush(stdout); if(progname() != NULL) fprintf(stderr, "%s: ", progname()); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); if (fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') fprintf(stderr, "%s", strerror(errno)); fprintf(stderr, "\n"); exit(2); /*프로그램이 실패하는 경우의 관습적인 값*/ } void weprintf(char *fmt, ...) { va_list args; fflush(stdout); if(progname() != NULL) fwprintf(stderr, "%s: ", progname()); va_start(args, fmt); vfwprintf(stderr, fmt, args); va_end(args); if (fmt[0] != '\0' && fmt[wcslen(fmt)-1] == ':') fwprintf(stderr, "%s", strerror(errno)); fwprintf(stderr, "\n"); exit(2); /*프로그램이 실패하는 경우의 관습적인 값*/ } /* estrdup: 문자열을 복사하고 에러 발생시 종료 */ char *estrdup(char *s) { char *t; t = (char*) malloc(strlen(s)+1); if (t == NULL) eprintf("estrdup(\"%.20s\") failed:", s); strcpy(t, s); return t; } /* emalloc: 메모리를 할당하고, 에러 발생시 종료 */ void *emalloc(size_t n) { void *p; p = malloc(n); if (p == NULL) eprintf("malloc of %u bytes failed:", n); return p; } static char *name = NULL; // 메시지 출력을 위한 이름 /* setprognmae: 프로그램 이름 지정 */ void setprogname(char *str) { name = estrdup(str); } /* progname: 저장된 프로그램 이름 리턴 */ char *progname(void) { return name; }
Dreamy의 코드 스크랩내가 모으고 내가 보는
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5