1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /* 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); } |
1 2 3 4 5 6 7 8 | /* 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 ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #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; } |
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5