/** * Load printf-template from file, specified by options or config. */ static int load_printf_template(void) { FILE* fd = fopen(opt.template_file, "rb"); char buffer[8192]; size_t len; int error = 0; if(!fd) { log_file_error(opt.template_file); return 0; } rhash_data.template_text = rsh_str_new(); while(!feof(fd)) { len = fread(buffer, 1, 8192, fd); /* read can return -1 on error */ if(len == (size_t)-1) break; rsh_str_append_n(rhash_data.template_text, buffer, len); if(rhash_data.template_text->len >= MAX_TEMPLATE_SIZE) { log_msg(_("%s: template file is too big\n"), opt.template_file); error = 1; } } if(ferror(fd)) { log_file_error(opt.template_file); error = 1; } fclose(fd); rhash_data.printf_str = rhash_data.template_text->str; return !error; }
/** * Initialize printf string according to program options. * The function is called only when a printf format string is not specified * from command line, so it should be constructed from other options. * * @param out a string buffer to place the resulting format string into. */ void init_printf_format(strbuf_t* out) { const char* fmt, *tail = 0; unsigned bit, index = 0; int uppercase; char up_flag; unsigned force_base32_mask = 0; if(!opt.fmt) { /* print SFV header for CRC32 or if no hash sums options specified */ opt.fmt = (opt.sum_flags == RHASH_CRC32 || !opt.sum_flags ? FMT_SFV : FMT_SIMPLE); } uppercase = ((opt.flags & OPT_UPPERCASE) || (!(opt.flags & OPT_LOWERCASE) && (opt.fmt & FMT_SFV))); up_flag = (uppercase ? ~0x20 : 0xFF); rsh_str_ensure_size(out, 1024); /* allocate big enough buffer */ if(opt.sum_flags & OPT_ED2K_LINK) { rsh_str_append_n(out, "%l", 2); out->str[1] &= up_flag; return; } if(opt.sum_flags == 0) return; if(opt.fmt == FMT_BSD) { fmt = "\003(%p) = \001\\n"; } else if(opt.fmt == FMT_MAGNET) { rsh_str_append(out, "magnet:?xl=%s&dn=%{urlname}"); fmt = "&xt=urn:\002:\001"; force_base32_mask = (RHASH_SHA1 | RHASH_BTIH); tail = "\\n"; } else if(opt.fmt == FMT_SIMPLE && 0 == (opt.sum_flags & (opt.sum_flags - 1))) { fmt = "\001 %p\\n"; } else { rsh_str_append_n(out, "%p", 2); fmt = (opt.fmt == FMT_SFV ? " \001" : " \001"); tail = "\\n"; } /* loop by hashes */ for(bit = 1 << index; bit <= opt.sum_flags; bit = bit << 1, index++) { const char *p; print_hash_info *info; if((bit & opt.sum_flags) == 0) continue; p = fmt; info = &hash_info_table[index]; /* ensure the output buffer have enough space */ rsh_str_ensure_size(out, out->len + 256); for(;;) { int i; while(*p >= 0x20) out->str[out->len++] = *(p++); if(*p == 0) break; switch((int)*(p++)) { case 1: out->str[out->len++] = '%'; if( (bit & force_base32_mask) != 0 ) { out->str[out->len++] = 'b'; } if(info->short_char) out->str[out->len++] = info->short_char & up_flag; else { char *letter; out->str[out->len++] = '{'; letter = out->str + out->len; rsh_str_append(out, info->short_name); *letter &= up_flag; out->str[out->len++] = '}'; } break; case 2: rsh_str_append(out, rhash_get_magnet_name(bit)); break; case 3: rsh_str_append(out, info->name); i = (int)strlen(info->name); for(i = (i < 5 ? 6 - i : 1); i > 0; i--) out->str[out->len++] = ' '; break; } } } if(tail) { rsh_str_append(out, tail); } out->str[out->len] = '\0'; }
/** * Append a null-terminated string to the string string buffer. * * @param str pointer to the string buffer * @param text the null-terminated string to append */ void rsh_str_append(strbuf_t *str, const char* text) { rsh_str_append_n(str, text, strlen(text)); }