/*
* Copyright (c) 2019 Clementine Computing LLC.
*
* This file is part of PopuFare.
*
* PopuFare is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PopuFare is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with PopuFare. If not, see .
*
*/
#include
#include
#include
#include
#include
#include
#include
#include
//extern char *optarg;
int g_start_pos = 0;
int g_end_pos = -1;
int g_modulus = 16;
char *g_fn = NULL;
int g_verbose_flag = 0;
int g_cononical_flag = 0;
void print_usage_and_exit(void)
{
printf("simple utility to look at raw data of files\n");
printf("usage:\n");
printf(" -f fn filename\n");
printf(" [-s start] start byte (default start)\n");
printf(" [-e end] end byte (default end)\n");
printf(" [-m mod] newline every 'mod' entries (default 16)\n");
printf(" [-C] 'cononical' view. Print printable ascii next alongsize value\n");
printf(" [-h] help\n");
printf(" [-v] verbose flag\n");
exit(0);
}
int main(int argc, char **argv)
{
int i, k;
int fd = -1;
struct stat st;
int r;
int read_end = -1;
char buf[16] = {0};
int c;
while ((c = getopt(argc, argv, "hvs:e:m:f:C")) != -1)
switch (c)
{
case 'f': g_fn = strdup(optarg); break;
case 'C': g_cononical_flag = 1; break;
case 'h': print_usage_and_exit(); exit(0); break;
case 'v': g_verbose_flag = 1; break;
case 's': g_start_pos = atoi(optarg); break;
case 'e': g_end_pos = atoi(optarg); break;
case 'm': g_modulus = atoi(optarg); break;
default: print_usage_and_exit(); exit(0); break;
}
if ( !g_fn )
{
printf("provide filename\n");
print_usage_and_exit();
}
if ((g_start_pos < 0) ||
(g_modulus < 1) )
{
printf("start byte must be non-negative and modulus must be greater than 0\n");
print_usage_and_exit();
}
r = stat( g_fn, &st );
if (r < 0)
{
perror(g_fn);
exit(-1);
}
fd = open( g_fn, O_RDONLY );
if (fd < 0)
{
perror(g_fn);
exit(-1);
}
read_end = st.st_size;
if ( (g_end_pos >= 0) && (g_end_pos < st.st_size) )
read_end = g_end_pos+1;
if (g_start_pos>0)
lseek( fd, g_start_pos, SEEK_SET );
printf("start %i end %i\n", g_start_pos, read_end);
printf("#output in hex\n");
for (k=0, i=g_start_pos; i < read_end ; i++, k++)
{
if ((k % g_modulus)==0)
{
if (k>0)
printf("\n");
if (g_cononical_flag)
{
printf("[%4x]", i);
}
}
r = read( fd, buf, 1 );
if (r < 0)
{
perror("read error");
exit(-1);
}
printf(" %02x", buf[0] );
if (g_cononical_flag)
{
printf(" %c ", isprint(buf[0]) ? buf[0] : '.' );
}
}
close(fd);
printf("\n");
return 0;
}