add human.c, really early stages
This commit is contained in:
parent
fca19a877f
commit
5cb230bd63
216
c/human.c
Normal file
216
c/human.c
Normal file
@ -0,0 +1,216 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define ARGUMENTS "d:f:"
|
||||
|
||||
struct fields
|
||||
{
|
||||
int nbfields;
|
||||
unsigned int *fields;
|
||||
};
|
||||
|
||||
void
|
||||
chomp (const char *s)
|
||||
{
|
||||
char *p;
|
||||
while (NULL != s && NULL != (p = strrchr(s, '\n'))) {
|
||||
*p = '\0';
|
||||
}
|
||||
} /* chomp */
|
||||
|
||||
int
|
||||
human (const char *s, char *stmp, ssize_t bufsize)
|
||||
{
|
||||
unsigned long long int val = strtoull(s, NULL, 10);
|
||||
|
||||
char suf = ' ';
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'k';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'M';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'M';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'G';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'T';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'P';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'E';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'Z';
|
||||
}
|
||||
|
||||
if(val > 1000) {
|
||||
val /= 1000;
|
||||
suf = 'Y';
|
||||
}
|
||||
|
||||
snprintf(stmp, bufsize, "%llu %co", val, suf);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
print_token_to_human (const char *token)
|
||||
{
|
||||
char *stmp = malloc(BUFSIZ);
|
||||
if(stmp != 0) {
|
||||
int ret = human(token, stmp, BUFSIZ);
|
||||
printf("%s ", stmp);
|
||||
free(stmp);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
print_delim (char *s, const char *delim, const struct fields *f)
|
||||
{
|
||||
char *token, *saveptr;
|
||||
char *str;
|
||||
int i, j;
|
||||
|
||||
// printf("%d fields :: ", f->nbfields);
|
||||
// for( i = 0 ; i < f->nbfields ; i++) {
|
||||
// printf("%u, ", f->fields[i]);
|
||||
// }
|
||||
// printf("\n");
|
||||
|
||||
for (str = s, i = 1; ; str = NULL, i++) {
|
||||
token = strtok_r(str, delim, &saveptr);
|
||||
if (token == NULL)
|
||||
break;
|
||||
|
||||
// check if we need to print the current token humanized
|
||||
int found = 0;
|
||||
|
||||
for (j = 0 ; j < f->nbfields ; j++ ) {
|
||||
if( i == f->fields[j] ) {
|
||||
print_token_to_human(token);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// print the current token not humanized
|
||||
if (found == 0) {
|
||||
printf("%s ", token);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* print every line, with the first token humanized
|
||||
* there is a split in the line by the space character to get tokens
|
||||
*/
|
||||
|
||||
void
|
||||
print_human (char *s)
|
||||
{
|
||||
struct fields f;
|
||||
f.nbfields = 1;
|
||||
f.fields = malloc(sizeof(unsigned int) * 1);
|
||||
f.fields[0] = 1;
|
||||
print_delim (s, " ", &f);
|
||||
}
|
||||
|
||||
// get the index of every token to humanize
|
||||
int
|
||||
get_tok_to_humanize (char *s, struct fields *f)
|
||||
{
|
||||
if(f == NULL || s == NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *str = NULL;
|
||||
char *token = NULL, *saveptr = NULL;
|
||||
f->nbfields = 0;
|
||||
|
||||
// counts the number of fields
|
||||
char * strtmp = s;
|
||||
while(*strtmp++ != '\0') {
|
||||
if (*strtmp == ',')
|
||||
f->nbfields++;
|
||||
}
|
||||
f->nbfields++;
|
||||
|
||||
f->fields = (unsigned int *) malloc(sizeof(unsigned int) * f->nbfields);
|
||||
|
||||
int i;
|
||||
for (str = s, i = 0; ; str = NULL, i++) {
|
||||
token = strtok_r(str, ",", &saveptr);
|
||||
if (token == NULL)
|
||||
break;
|
||||
|
||||
f->fields[i] = atoi(token);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
char *strtmp = malloc(BUFSIZ);
|
||||
char *delim = NULL; // options
|
||||
struct fields fields;
|
||||
|
||||
if(argc < 1 || argc > 3) {
|
||||
fprintf(stderr, "Usage: %s [fields [delim]]\n", argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int ret ;
|
||||
switch (argc) {
|
||||
case 3 :
|
||||
ret = get_tok_to_humanize(argv[1], &fields);
|
||||
delim = argv[2];
|
||||
break;
|
||||
case 2 :
|
||||
ret = get_tok_to_humanize(argv[1], &fields);
|
||||
delim = (char *) malloc(1);
|
||||
*delim = ' ';
|
||||
break;
|
||||
}
|
||||
|
||||
while(fgets(strtmp, BUFSIZ, stdin)) {
|
||||
|
||||
chomp(strtmp);
|
||||
|
||||
if(delim) {
|
||||
print_delim (strtmp, delim, &fields);
|
||||
}
|
||||
else {
|
||||
print_human (strtmp);
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
free(strtmp);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
Loading…
Reference in New Issue
Block a user