Implemented -h and -n

This commit is contained in:
Pierre Pronchery 2007-05-09 21:40:04 +00:00
parent 64c96d0722
commit 04059075af

View File

@ -16,12 +16,14 @@
typedef struct _Prefs typedef struct _Prefs
{ {
int flags; int flags;
char * header;
int lines; int lines;
int width; int width;
int offset; int offset;
} Prefs; } Prefs;
#define PREFS_d 1 #define PREFS_d 1
#define PREFS_t 2 #define PREFS_n 2
#define PREFS_t 4
/* functions */ /* functions */
static int _pr_error(char const * message, int ret); static int _pr_error(char const * message, int ret);
@ -74,6 +76,7 @@ static int _pr_do(Prefs * prefs, FILE * fp, char const * filename)
size_t len; size_t len;
int nb = 0; int nb = 0;
size_t page = 1; size_t page = 1;
size_t line = 1;
if(fp == stdin) if(fp == stdin)
st.st_mtime = time(NULL); st.st_mtime = time(NULL);
@ -92,6 +95,8 @@ static int _pr_do(Prefs * prefs, FILE * fp, char const * filename)
nb = 10; nb = 10;
} }
_do_offset(prefs->offset); /* FIXME not if truncated line */ _do_offset(prefs->offset); /* FIXME not if truncated line */
if(prefs->flags & PREFS_n)
printf("%5u ", line++);
if((len = strlen(buf)) > 0 && buf[len - 1] == '\n' if((len = strlen(buf)) > 0 && buf[len - 1] == '\n'
&& prefs->flags & PREFS_d) && prefs->flags & PREFS_d)
buf[len++] = '\n'; /* XXX with offset? */ buf[len++] = '\n'; /* XXX with offset? */
@ -135,7 +140,9 @@ static void _do_header(Prefs * prefs, time_t const mtime, char const * filename,
localtime_r(&mtime, &tm); localtime_r(&mtime, &tm);
strftime(buf, sizeof(buf) - 1, "%b %e %H:%M %Y", &tm); strftime(buf, sizeof(buf) - 1, "%b %e %H:%M %Y", &tm);
buf[sizeof(buf) - 1] = '\0'; buf[sizeof(buf) - 1] = '\0';
printf("%s %s%s%u", buf, filename, " Page ", page); printf("%s %s%s%u", buf, prefs->header != NULL
? prefs->header : filename, " Page ",
page);
} }
fputc('\n', stdout); fputc('\n', stdout);
} }
@ -173,20 +180,28 @@ int main(int argc, char * argv[])
char * p; char * p;
memset(&prefs, 0, sizeof(prefs)); memset(&prefs, 0, sizeof(prefs));
prefs.header = NULL;
prefs.lines = 66; prefs.lines = 66;
prefs.offset = 0;
prefs.width = 72; prefs.width = 72;
while((o = getopt(argc, argv, "dl:o:tw:")) != -1) while((o = getopt(argc, argv, "dh:l:no:tw:")) != -1)
switch(o) switch(o)
{ {
case 'd': case 'd':
prefs.flags |= PREFS_d; prefs.flags |= PREFS_d;
break; break;
case 'h':
prefs.header = optarg;
break;
case 'l': case 'l':
prefs.lines = strtol(optarg, &p, 10); prefs.lines = strtol(optarg, &p, 10);
if(optarg[0] == '\0' || *p != '\0' if(optarg[0] == '\0' || *p != '\0'
|| prefs.lines <= 0) || prefs.lines <= 0)
return _usage(); return _usage();
break; break;
case 'n':
prefs.flags |= PREFS_n;
break;
case 'o': case 'o':
prefs.offset = strtol(optarg, &p, 10); prefs.offset = strtol(optarg, &p, 10);
if(optarg[0] == '\0' || *p != '\0' if(optarg[0] == '\0' || *p != '\0'