70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
/*strings.c - print the strings of printable characters in files.
|
|
*
|
|
* Copyright 2014 Kyung-su Kim <kaspyx@gmail.com>
|
|
* Copyright 2014 Kyungwan Han <asura321@gmail.com>
|
|
*
|
|
* No Standard
|
|
* TODO: utf8 strings
|
|
* TODO: posix -t
|
|
|
|
USE_STRINGS(NEWTOY(strings, "an#=4<1fo", TOYFLAG_USR|TOYFLAG_BIN))
|
|
|
|
config STRINGS
|
|
bool "strings"
|
|
default y
|
|
help
|
|
usage: strings [-fo] [-n LEN] [FILE...]
|
|
|
|
Display printable strings in a binary file
|
|
|
|
-f Precede strings with filenames
|
|
-n At least LEN characters form a string (default 4)
|
|
-o Precede strings with decimal offsets
|
|
*/
|
|
|
|
#define FOR_strings
|
|
#include "toys.h"
|
|
|
|
GLOBALS(
|
|
long num;
|
|
)
|
|
|
|
static void do_strings(int fd, char *filename)
|
|
{
|
|
int nread, i, wlen = TT.num, count = 0;
|
|
off_t offset = 0;
|
|
char *string = xzalloc(wlen + 1);
|
|
|
|
for (;;) {
|
|
nread = read(fd, toybuf, sizeof(toybuf));
|
|
if (nread < 0) perror_msg_raw(filename);
|
|
if (nread < 1) {
|
|
if (count == wlen) xputc('\n');
|
|
break;
|
|
}
|
|
for (i = 0; i < nread; i++, offset++) {
|
|
if (((toybuf[i] >= 32) && (toybuf[i] <= 126)) || (toybuf[i] == '\t')) {
|
|
if (count == wlen) fputc(toybuf[i], stdout);
|
|
else {
|
|
string[count++] = toybuf[i];
|
|
if (count == wlen) {
|
|
if (toys.optflags & FLAG_f) printf("%s: ", filename);
|
|
if (toys.optflags & FLAG_o)
|
|
printf("%7lld ",(long long)(offset + 1 - wlen));
|
|
printf("%s", string);
|
|
}
|
|
}
|
|
} else {
|
|
if (count == wlen) xputc('\n');
|
|
count = 0;
|
|
}
|
|
}
|
|
}
|
|
xclose(fd);
|
|
free(string);
|
|
}
|
|
|
|
void strings_main(void)
|
|
{
|
|
loopfiles(toys.optargs, do_strings);
|
|
}
|