static inline void _print_grphwlk_state(const char *str, uint64_t nom, size_t denom) { char nom_str[100], denom_str[100]; ulong_to_str(nom, nom_str); ulong_to_str(denom, denom_str); pad_str(nom_str, ' ', 15); pad_str(denom_str, ' ', 15); status(PREFIX" %s: %s / %s\t[ %3zu%% ]", str, nom_str, denom_str, !denom ? 0 : (size_t)(((100.0*nom)/denom)+0.5)); }
/* convert - The main conversion function. *format points at a '%'. - str contains the output string. The original buffer was 'size' large (but *str is the current insert position inside the buffer). - *n is the offset inside the output buffer of the current insert position, or: (str - start_str). - args is an array of arguments passed to snprintf. - *thisarg is the next argument to process. */ static const char *convert(char *str, unsigned size, const char *format, int *n, arg_t *args, int *thisarg) { pf_state_t s; memset((uint8_t*)&s, 0, sizeof(pf_state_t)); s.precision = 1; char buf[BUFSZ]; while (*++format) { switch (*format) { case '%': /* %% = simple escaped % */ return cat_char(str, size, n, '%'); case '#': /* Alternate form flag */ s.alternate_form = 1; break; case '0': /* Zero pad */ s.zero_pad = 1; break; case '-': /* Left justify */ s.left_justify = 1; break; case ' ': /* Prefix any positive signed conversion with a space */ s.pos_sign_prefix_space = 1; break; case '+': /* Prefix any positive signed conversion with a + */ s.pos_sign_prefix_plus = 1; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '*': { /* Number starting with nonzero or '*' is the minimum field width. */ s.min_field_width = parse_direct_or_indirect_int(&format, args, thisarg); break; } case '.': /* Precision */ ++format; s.precision = parse_direct_or_indirect_int(&format, args, thisarg); break; case 'd': case 'i': /* If precision is given, zero_pad must be disabled. */ if (s.precision != 1) s.zero_pad = 0; convert_int(buf, BUFSZ, args[(*thisarg)++].i, 10, s, 1); pad_str(str, size, n, buf, 1, s, NULL); return format+1; case 'o': /* If precision is given, zero_pad must be disabled. */ if (s.precision != 1) s.zero_pad = 0; convert_int(buf, BUFSZ, args[(*thisarg)++].u, 8, s, 0); pad_str(str, size, n, buf, 0, s, s.alternate_form ? "0" : NULL); return format+1; case 'u': /* If precision is given, zero_pad must be disabled. */ if (s.precision != 1) s.zero_pad = 0; convert_int(buf, BUFSZ, (unsigned int)args[(*thisarg)++].i, 10, s, 0); pad_str(str, size, n, buf, 0, s, NULL); return format+1; case 'x': /* If precision is given, zero_pad must be disabled. */ if (s.precision != 1) s.zero_pad = 0; convert_int(buf, BUFSZ, args[(*thisarg)++].u, 16, s, 0); pad_str(str, size, n, buf, 0, s, s.alternate_form ? "0x" : NULL); return format+1; case 'X': /* If precision is given, zero_pad must be disabled. */ if (s.precision != 1) s.zero_pad = 0; s.transliterate_hex = 1; convert_int(buf, BUFSZ, args[(*thisarg)++].u, 16, s, 0); pad_str(str, size, n, buf, 0, s, s.alternate_form ? "0X" : NULL); return format+1; case 'c': s.zero_pad = 0; buf[0] = (char)args[(*thisarg)++].i; buf[1] = '\0'; pad_str(str, size, n, buf, 0, s, NULL); return format+1; case 's': { s.zero_pad = 0; char *in = (char*)args[(*thisarg)++].p; if (!in) in = "<null>"; pad_str(str, size, n, in, 0, s, NULL); return format+1; } case 'p': /* Equivalent to %#x */ s.zero_pad = 0; convert_int(buf, BUFSZ, (uintptr_t)args[(*thisarg)++].p, 16, s, 0); pad_str(str, size, n, buf, 0, s, "0x"); return format+1; case 'n': /* Write out the number of arguments converted. */ s.zero_pad = 0; convert_int(buf, BUFSZ, (uintptr_t)*thisarg, 10, s, 0); pad_str(str, size, n, buf, 0, s, NULL); return format+1; case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'a': case 'A': pad_str(str, size, n, "???", 0, s, NULL); (*thisarg)++; return format+1; default: /* Shouldn't get here, but we don't have panic available so just try not to infinite loop. */ return format; } } return format; }
void extract_entry (char* tarname, int i, int overwrite, int verbose, int extract) { char filename[100]; char mode[8]; char owner[8]; char group[8]; char size[12]; char modified[12]; char checksum[8]; char type[1]; FILE* tar; tar = fopen(tarname, "rb"); fseek(tar, i, SEEK_SET); fgets(filename, 99, tar); fseek(tar, i + 100, SEEK_SET); fgets(mode, 8, tar); fseek(tar, i + 108, SEEK_SET); fgets(owner, 8, tar); fseek(tar, i + 116, SEEK_SET); fgets(group, 8, tar); fseek(tar, i + 124, SEEK_SET); fgets(size, 12, tar); fseek(tar, i + 136, SEEK_SET); fgets(modified, 12, tar); fseek(tar, i + 148, SEEK_SET); fgets(checksum, 8, tar); fseek(tar, i + 156, SEEK_SET); fgets(type, 2, tar); char contents[10000]; fseek(tar, i + 512, SEEK_SET); fread(contents, 10000, 1, tar); fclose(tar); if (verbose == 1 && extract == 1) { printf("%s\n", filename); } else { char smodified[25]; char ssize[12]; pad_str(size, 12, ssize); to_date_time(octal_to_dec(modified), smodified); printf("%d %s %s %s\n", atoi(mode), ssize, smodified, filename); } if (strcmp(type, "5") == 0 && extract == 1) { char command[1000]; strcat(command, "mkdir "); #ifdef __unix__ strcat(command, "-p "); strcat(command, filename); #else char wfilename[1000]; str_replace(filename, '/', '\\', wfilename); strcat(command, wfilename); if (file_exists(filename) == 0) { #endif int ec = system(command); if (ec == 1) { printf("tarino-native: Exit code from system call was 1.\n"); } #ifndef __unix__ } #endif memset(command, 0, strlen(command)); } if (strcmp(type, "0") == 0 && extract == 1) { if (overwrite == 1 || file_exists(filename) == 1) { FILE* out; out = fopen(filename, "wb"); int length = strlen(contents); if (strstr(filename, ".gif") != 0) { length = get_gif_length(contents); } if (strstr(filename, ".png") != 0) { length = get_png_length(contents); } fwrite(contents, length, 1, out); fclose(out); } } }