diff options
Diffstat (limited to 'ext/fileinfo/libmagic/print.c')
-rw-r--r-- | ext/fileinfo/libmagic/print.c | 149 |
1 files changed, 140 insertions, 9 deletions
diff --git a/ext/fileinfo/libmagic/print.c b/ext/fileinfo/libmagic/print.c index 5edb67f124..e7ee460bed 100644 --- a/ext/fileinfo/libmagic/print.c +++ b/ext/fileinfo/libmagic/print.c @@ -29,8 +29,6 @@ * print.c - debugging printout routines */ -#include "php.h" - #include "file.h" #include <stdio.h> #include <errno.h> @@ -48,21 +46,154 @@ FILE_RCSID("@(#)$File: print.c,v 1.63 2008/02/17 19:28:54 rrt Exp $") #define SZOF(a) (sizeof(a) / sizeof(a[0])) +protected void +file_mdump(struct magic *m) +{ + private const char optyp[] = { FILE_OPS }; + + (void) fprintf(stderr, "[%u", m->lineno); + (void) fprintf(stderr, ">>>>>>>> %u" + 8 - (m->cont_level & 7), + m->offset); + + if (m->flag & INDIR) { + (void) fprintf(stderr, "(%s,", + /* Note: type is unsigned */ + (m->in_type < file_nnames) ? + file_names[m->in_type] : "*bad*"); + if (m->in_op & FILE_OPINVERSE) + (void) fputc('~', stderr); + (void) fprintf(stderr, "%c%u),", + ((m->in_op & FILE_OPS_MASK) < SZOF(optyp)) ? + optyp[m->in_op & FILE_OPS_MASK] : '?', + m->in_offset); + } + (void) fprintf(stderr, " %s%s", (m->flag & UNSIGNED) ? "u" : "", + /* Note: type is unsigned */ + (m->type < file_nnames) ? file_names[m->type] : "*bad*"); + if (m->mask_op & FILE_OPINVERSE) + (void) fputc('~', stderr); + + if (IS_LIBMAGIC_STRING(m->type)) { + if (m->str_flags) { + (void) fputc('/', stderr); + if (m->str_flags & STRING_COMPACT_BLANK) + (void) fputc(CHAR_COMPACT_BLANK, stderr); + if (m->str_flags & STRING_COMPACT_OPTIONAL_BLANK) + (void) fputc(CHAR_COMPACT_OPTIONAL_BLANK, + stderr); + if (m->str_flags & STRING_IGNORE_LOWERCASE) + (void) fputc(CHAR_IGNORE_LOWERCASE, stderr); + if (m->str_flags & STRING_IGNORE_UPPERCASE) + (void) fputc(CHAR_IGNORE_UPPERCASE, stderr); + if (m->str_flags & REGEX_OFFSET_START) + (void) fputc(CHAR_REGEX_OFFSET_START, stderr); + } + if (m->str_range) + (void) fprintf(stderr, "/%u", m->str_range); + } + else { + if ((m->mask_op & FILE_OPS_MASK) < SZOF(optyp)) + (void) fputc(optyp[m->mask_op & FILE_OPS_MASK], stderr); + else + (void) fputc('?', stderr); + + if (m->num_mask) { + (void) fprintf(stderr, "%.8llx", + (unsigned long long)m->num_mask); + } + } + (void) fprintf(stderr, ",%c", m->reln); + + if (m->reln != 'x') { + switch (m->type) { + case FILE_BYTE: + case FILE_SHORT: + case FILE_LONG: + case FILE_LESHORT: + case FILE_LELONG: + case FILE_MELONG: + case FILE_BESHORT: + case FILE_BELONG: + (void) fprintf(stderr, "%d", m->value.l); + break; + case FILE_BEQUAD: + case FILE_LEQUAD: + case FILE_QUAD: + (void) fprintf(stderr, "%lld", + (unsigned long long)m->value.q); + break; + case FILE_PSTRING: + case FILE_STRING: + case FILE_REGEX: + case FILE_BESTRING16: + case FILE_LESTRING16: + case FILE_SEARCH: + file_showstr(stderr, m->value.s, (size_t)m->vallen); + break; + case FILE_DATE: + case FILE_LEDATE: + case FILE_BEDATE: + case FILE_MEDATE: + (void)fprintf(stderr, "%s,", + file_fmttime(m->value.l, 1)); + break; + case FILE_LDATE: + case FILE_LELDATE: + case FILE_BELDATE: + case FILE_MELDATE: + (void)fprintf(stderr, "%s,", + file_fmttime(m->value.l, 0)); + break; + case FILE_QDATE: + case FILE_LEQDATE: + case FILE_BEQDATE: + (void)fprintf(stderr, "%s,", + file_fmttime((uint32_t)m->value.q, 1)); + break; + case FILE_QLDATE: + case FILE_LEQLDATE: + case FILE_BEQLDATE: + (void)fprintf(stderr, "%s,", + file_fmttime((uint32_t)m->value.q, 0)); + break; + case FILE_FLOAT: + case FILE_BEFLOAT: + case FILE_LEFLOAT: + (void) fprintf(stderr, "%G", m->value.f); + break; + case FILE_DOUBLE: + case FILE_BEDOUBLE: + case FILE_LEDOUBLE: + (void) fprintf(stderr, "%G", m->value.d); + break; + case FILE_DEFAULT: + /* XXX - do anything here? */ + break; + default: + (void) fputs("*bad*", stderr); + break; + } + } + (void) fprintf(stderr, ",\"%s\"]\n", m->desc); +} + /*VARARGS*/ protected void file_magwarn(struct magic_set *ms, const char *f, ...) { va_list va; - char *expanded_format; - TSRMLS_FETCH(); + /* cuz we use stdout for most, stderr here */ + (void) fflush(stdout); + + if (ms->file) + (void) fprintf(stderr, "%s, %lu: ", ms->file, + (unsigned long)ms->line); + (void) fprintf(stderr, "Warning: "); va_start(va, f); - vasprintf(&expanded_format, f, va); + (void) vfprintf(stderr, f, va); va_end(va); - - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Warning: %s", expanded_format); - - free(expanded_format); + (void) fputc('\n', stderr); } protected const char * |