/* 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;
}
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5