Lines Matching +full:pmax +full:- +full:pascal
2 * Copyright (c) Ian F. Darwin 1986-1995.
4 * maintained 1995-present by Christos Zoulas and others.
29 * apprentice - make one pass through /etc/magic, learning its secrets.
76 #define MAP_FAILED (void *) -1
179 #define DECLARE_FIELD(name) { # name, sizeof(# name) - 1, parse_ ## name }
213 ret = magic_compile(ms, argv[1]) == -1 ? 1 : 0; in main()
229 * XXX - the actual Single UNIX Specification says that "long" means "long",
230 * as in the C data type, but we treat it as meaning "4-byte integer".
236 # define XX(s) s, (sizeof(s) - 1)
320 for (p = tbl; p->len; p++) { in get_type()
321 if (strncmp(l, p->name, p->len) == 0) { in get_type()
323 *t = l + p->len; in get_type()
327 return p->type; in get_type()
359 * XXX - the actual Single UNIX Specification says in get_standard_integer_type()
361 * but we treat it as meaning "4-byte integer". in get_standard_integer_type()
382 * of 1, 2, 4, and 8 - the Single UNIX Specification in get_standard_integer_type()
388 * non-power-of-2 values. in get_standard_integer_type()
391 /* Multi-digit, so > 9 */ in get_standard_integer_type()
408 /* XXX - what about 3, 5, 6, or 7? */ in get_standard_integer_type()
434 for (p = type_tbl; p->len; p++) { in init_file_tables()
435 assert(p->type < FILE_NAMES_SIZE); in init_file_tables()
436 file_names[p->type] = p->name; in init_file_tables()
437 file_formats[p->type] = p->format; in init_file_tables()
439 assert(p - type_tbl == FILE_NAMES_SIZE); in init_file_tables()
447 mlp->map = NULL; in add_mlist()
449 return -1; in add_mlist()
451 ml->map = idx == 0 ? map : NULL; in add_mlist()
452 ml->magic = map->magic[idx]; in add_mlist()
453 ml->nmagic = map->nmagic[idx]; in add_mlist()
454 if (ml->nmagic) { in add_mlist()
455 ml->magic_rxcomp = CAST(file_regex_t **, in add_mlist()
456 calloc(ml->nmagic, sizeof(*ml->magic_rxcomp))); in add_mlist()
457 if (ml->magic_rxcomp == NULL) { in add_mlist()
459 return -1; in add_mlist()
462 ml->magic_rxcomp = NULL; in add_mlist()
463 mlp->prev->next = ml; in add_mlist()
464 ml->prev = mlp->prev; in add_mlist()
465 ml->next = mlp; in add_mlist()
466 mlp->prev = ml; in add_mlist()
483 CAST(unsigned long, sizeof(*map->magic[0])), in apprentice_1()
485 return -1; in apprentice_1()
491 return -1; in apprentice_1()
498 if (ms->flags & MAGIC_CHECK) in apprentice_1()
502 return -1; in apprentice_1()
506 if (add_mlist(ms->mlist[i], map, i) == -1) { in apprentice_1()
512 file_oomem(ms, sizeof(*ms->mlist[0])); in apprentice_1()
513 return -1; in apprentice_1()
521 apprentice_list(ms->mlist[i], BINTEST); in apprentice_1()
523 apprentice_list(ms->mlist[i], TEXTTEST); in apprentice_1()
539 mlist_free(ms->mlist[i]); in file_ms_free()
540 free(ms->o.pbuf); in file_ms_free()
541 free(ms->o.buf); in file_ms_free()
542 free(ms->c.li); in file_ms_free()
543 free(ms->fnamebuf); in file_ms_free()
545 freelocale(ms->c_lc_ctype); in file_ms_free()
560 if (magic_setflags(ms, flags) == -1) { in file_ms_alloc()
565 ms->o.buf = ms->o.pbuf = NULL; in file_ms_alloc()
566 ms->o.blen = 0; in file_ms_alloc()
567 len = (ms->c.len = 10) * sizeof(*ms->c.li); in file_ms_alloc()
569 if ((ms->c.li = CAST(struct level_info *, malloc(len))) == NULL) in file_ms_alloc()
572 ms->event_flags = 0; in file_ms_alloc()
573 ms->error = -1; in file_ms_alloc()
575 ms->mlist[i] = NULL; in file_ms_alloc()
576 ms->fnamebuf = NULL; in file_ms_alloc()
577 ms->file = "unknown"; in file_ms_alloc()
578 ms->line = 0; in file_ms_alloc()
579 ms->magwarn = 0; in file_ms_alloc()
580 ms->indir_max = FILE_INDIR_MAX; in file_ms_alloc()
581 ms->name_max = FILE_NAME_MAX; in file_ms_alloc()
582 ms->elf_shnum_max = FILE_ELF_SHNUM_MAX; in file_ms_alloc()
583 ms->elf_shsize_max = FILE_ELF_SHSIZE_MAX; in file_ms_alloc()
584 ms->elf_phnum_max = FILE_ELF_PHNUM_MAX; in file_ms_alloc()
585 ms->elf_notes_max = FILE_ELF_NOTES_MAX; in file_ms_alloc()
586 ms->regex_max = FILE_REGEX_MAX; in file_ms_alloc()
587 ms->bytes_max = FILE_BYTES_MAX; in file_ms_alloc()
588 ms->encoding_max = FILE_ENCODING_MAX; in file_ms_alloc()
589 ms->magwarn_max = FILE_MAGWARN_MAX; in file_ms_alloc()
591 ms->c_lc_ctype = newlocale(LC_CTYPE_MASK, "C", 0); in file_ms_alloc()
592 assert(ms->c_lc_ctype != NULL); in file_ms_alloc()
608 switch (map->type) { in apprentice_unmap()
612 p = CAST(char *, map->p); in apprentice_unmap()
614 char *b = RCAST(char *, map->magic[i]); in apprentice_unmap()
615 if (p != NULL && b >= p && b <= p + map->len) in apprentice_unmap()
623 if (map->p && map->p != MAP_FAILED) in apprentice_unmap()
624 (void)munmap(map->p, map->len); in apprentice_unmap()
628 fprintf(stderr, "Bad map type %d", map->type); in apprentice_unmap()
641 mlist->next = mlist->prev = mlist; in mlist_alloc()
651 mlist_free(ms->mlist[i]); in mlist_free_all()
652 ms->mlist[i] = NULL; in mlist_free_all()
661 if (ml->map) in mlist_free_one()
662 apprentice_unmap(CAST(struct magic_map *, ml->map)); in mlist_free_one()
664 for (i = 0; i < ml->nmagic; ++i) { in mlist_free_one()
665 if (ml->magic_rxcomp[i]) { in mlist_free_one()
666 file_regfree(ml->magic_rxcomp[i]); in mlist_free_one()
667 free(ml->magic_rxcomp[i]); in mlist_free_one()
668 ml->magic_rxcomp[i] = NULL; in mlist_free_one()
671 free(ml->magic_rxcomp); in mlist_free_one()
672 ml->magic_rxcomp = NULL; in mlist_free_one()
684 for (ml = mlist->next; ml != mlist;) { in mlist_free()
685 next = ml->next; in mlist_free()
702 return -1; in buffer_apprentice()
709 mlist_free(ms->mlist[i]); in buffer_apprentice()
710 if ((ms->mlist[i] = mlist_alloc()) == NULL) { in buffer_apprentice()
711 file_oomem(ms, sizeof(*ms->mlist[0])); in buffer_apprentice()
722 if (add_mlist(ms->mlist[j], map, j) == -1) { in buffer_apprentice()
723 file_oomem(ms, sizeof(*ms->mlist[0])); in buffer_apprentice()
732 return -1; in buffer_apprentice()
741 int fileerr, errs = -1; in file_apprentice()
747 return -1; in file_apprentice()
751 free(ms->fnamebuf); in file_apprentice()
752 if ((ms->fnamebuf = strdup(fn)) == NULL) { in file_apprentice()
754 return -1; in file_apprentice()
758 mlist_free(ms->mlist[i]); in file_apprentice()
759 if ((ms->mlist[i] = mlist_alloc()) == NULL) { in file_apprentice()
760 file_oomem(ms, sizeof(*ms->mlist[0])); in file_apprentice()
762 mlist_free(ms->mlist[j]); in file_apprentice()
763 ms->mlist[j] = NULL; in file_apprentice()
765 return -1; in file_apprentice()
768 fn = ms->fnamebuf; in file_apprentice()
781 if (errs == -1) { in file_apprentice()
783 mlist_free(ms->mlist[i]); in file_apprentice()
784 ms->mlist[i] = NULL; in file_apprentice()
787 return -1; in file_apprentice()
798 mlist_free(ms->mlist[i]); in file_apprentice()
799 ms->mlist[i] = NULL; in file_apprentice()
811 return -1; in file_apprentice()
819 * - magic characters count 0 unless escaped.
820 * - [] expressions count 1
821 * - {} expressions count 0
822 * - regular characters or escaped magic characters count 1
823 * - 0 length expressions count as one
835 p--; in nonmagic()
848 p--; in nonmagic()
854 p--; in nonmagic()
942 switch (m->type) { in apprentice_magic_strength_1()
944 if (m->factor_op != FILE_FACTOR_OP_NONE) { in apprentice_magic_strength_1()
946 m->factor_op); in apprentice_magic_strength_1()
996 ts = typesize(m->type); in apprentice_magic_strength_1()
999 m->type); in apprentice_magic_strength_1()
1008 val += m->vallen * MULT; in apprentice_magic_strength_1()
1013 val += m->vallen * MULT / 2; in apprentice_magic_strength_1()
1017 if (m->vallen == 0) in apprentice_magic_strength_1()
1019 val += m->vallen * MAX(MULT / m->vallen, 1); in apprentice_magic_strength_1()
1023 v = nonmagic(m->value.s); in apprentice_magic_strength_1()
1038 (void)fprintf(stderr, "Bad type %d\n", m->type); in apprentice_magic_strength_1()
1042 switch (m->reln) { in apprentice_magic_strength_1()
1054 val -= 2 * MULT; in apprentice_magic_strength_1()
1059 val -= MULT; in apprentice_magic_strength_1()
1063 (void)fprintf(stderr, "Bad relation %c\n", m->reln); in apprentice_magic_strength_1()
1079 if (m->desc[0] == '\0') { in file_magic_strength()
1095 switch (m->factor_op) { in file_magic_strength()
1099 val += m->factor; in file_magic_strength()
1102 val -= m->factor; in file_magic_strength()
1105 val *= m->factor; in file_magic_strength()
1108 val /= m->factor; in file_magic_strength()
1111 (void)fprintf(stderr, "Bad factor_op %u\n", m->factor_op); in file_magic_strength()
1123 if (m->desc[0] == '\0') in file_magic_strength()
1138 size_t sa = file_magic_strength(ma->mp, ma->cont_count); in apprentice_sort()
1139 size_t sb = file_magic_strength(mb->mp, mb->cont_count); in apprentice_sort()
1141 struct magic mpa = *ma->mp; in apprentice_sort()
1142 struct magic mpb = *mb->mp; in apprentice_sort()
1150 ma->mp->desc); in apprentice_sort()
1152 file_mdump(ma->mp); in apprentice_sort()
1153 file_mdump(mb->mp); in apprentice_sort()
1157 return x > 0 ? -1 : 1; in apprentice_sort()
1159 return sa > sb ? -1 : 1; in apprentice_sort()
1170 for (ml = mlist->next; ml != mlist; ml = ml->next) { in apprentice_list()
1171 for (magindex = 0; magindex < ml->nmagic; magindex++) { in apprentice_list()
1172 struct magic *m = &ml->magic[magindex]; in apprentice_list()
1173 if ((m->flag & mode) != mode) { in apprentice_list()
1174 /* Skip sub-tests */ in apprentice_list()
1175 while (magindex + 1 < ml->nmagic && in apprentice_list()
1176 ml->magic[magindex + 1].cont_level != 0) in apprentice_list()
1178 continue; /* Skip to next top-level test*/ in apprentice_list()
1186 for (; magindex + 1 < ml->nmagic && in apprentice_list()
1187 ml->magic[magindex + 1].cont_level != 0; in apprentice_list()
1190 if (*ml->magic[descindex].desc == '\0' in apprentice_list()
1191 && *ml->magic[mi].desc) in apprentice_list()
1193 if (*ml->magic[mimeindex].mimetype == '\0' in apprentice_list()
1194 && *ml->magic[mi].mimetype) in apprentice_list()
1199 file_magic_strength(m, ml->nmagic - magindex), in apprentice_list()
1200 ml->magic[lineindex].lineno, in apprentice_list()
1201 ml->magic[descindex].desc, in apprentice_list()
1202 ml->magic[mimeindex].mimetype); in apprentice_list()
1210 switch (m->type) { in set_test_type()
1257 mstart->flag |= BINTEST; in set_test_type()
1264 if (mstart->str_flags & STRING_TEXTTEST) in set_test_type()
1265 mstart->flag |= TEXTTEST; in set_test_type()
1267 mstart->flag |= BINTEST; in set_test_type()
1272 if (mstart->str_flags & STRING_BINTEST) in set_test_type()
1273 mstart->flag |= BINTEST; in set_test_type()
1274 if (mstart->str_flags & STRING_TEXTTEST) in set_test_type()
1275 mstart->flag |= TEXTTEST; in set_test_type()
1277 if (mstart->flag & (TEXTTEST|BINTEST)) in set_test_type()
1281 if (file_looks_utf8(m->value.us, CAST(size_t, m->vallen), NULL, in set_test_type()
1283 mstart->flag |= BINTEST; in set_test_type()
1285 mstart->flag |= TEXTTEST; in set_test_type()
1302 size_t i = me->mp->type == FILE_NAME ? 1 : 0; in addentry()
1311 return -1; in addentry()
1336 FILE *f = fopen(ms->file = fn, "r"); in load_1()
1347 for (ms->line = 1; (len = getline(&line, &llen, f)) != -1; in load_1()
1348 ms->line++) { in load_1()
1349 if (ms->magwarn >= ms->magwarn_max) in load_1()
1353 if (line[len - 1] == '\n') { in load_1()
1355 line[len - 1] = '\0'; /* delete newline */ in load_1()
1366 if (CAST(size_t, len - 2) > bang[i].len && in load_1()
1386 len - bang[i].len - 2) != 0) { in load_1()
1436 if ((ms->flags & MAGIC_DEBUG) == 0) in set_text_binary()
1439 me[i].mp->mimetype, in set_text_binary()
1440 me[i].mp->mimetype[0] == '\0' ? "" : "; ", in set_text_binary()
1441 me[i].mp->desc[0] ? me[i].mp->desc : "(no description)", in set_text_binary()
1442 me[i].mp->flag & BINTEST ? binary : text); in set_text_binary()
1443 if (me[i].mp->flag & BINTEST) { in set_text_binary()
1444 char *p = strstr(me[i].mp->desc, text); in set_text_binary()
1445 if (p && (p == me[i].mp->desc || in set_text_binary()
1446 isspace(CAST(unsigned char, p[-1]))) && in set_text_binary()
1447 (p + len - me[i].mp->desc == MAXstring in set_text_binary()
1453 } while (++i < nme && me[i].mp->cont_level != 0); in set_text_binary()
1462 if (me[i].mp->cont_level == 0 && in set_last_default()
1463 me[i].mp->type == FILE_DEFAULT) { in set_last_default()
1465 if (me[i].mp->cont_level == 0) in set_last_default()
1468 /* XXX - Ugh! */ in set_last_default()
1469 ms->line = me[i].mp->lineno; in set_last_default()
1497 return -1; in coalesce_entries()
1535 ms->flags |= MAGIC_CHECK; /* Enable checks for parsed files */ in apprentice_load()
1543 map->type = MAP_TYPE_MALLOC; in apprentice_load()
1557 if (d->d_name[0] == '.') in apprentice_load()
1559 if (asprintf(&mfn, "%s/%s", fn, d->d_name) < 0) { in apprentice_load()
1561 strlen(fn) + strlen(d->d_name) + 2); in apprentice_load()
1566 if (stat(mfn, &st) == -1 || !S_ISREG(st.st_mode)) { in apprentice_load()
1605 if (mset[j].me[i].mp->cont_level != 0) { in apprentice_load()
1626 &map->magic[j], &map->nmagic[j]) == -1) { in apprentice_load()
1650 if (!(m->flag & UNSIGNED)) { in file_signextend()
1651 switch(m->type) { in file_signextend()
1724 if (ms->flags & MAGIC_CHECK) in file_signextend()
1725 file_magwarn(ms, "cannot happen: m->type=%d\n", in file_signextend()
1726 m->type); in file_signextend()
1736 if ((ms->flags & MAGIC_CHECK) == 0) in string_modifier_check()
1739 if ((m->type != FILE_REGEX || (m->str_flags & REGEX_LINE_COUNT) == 0) && in string_modifier_check()
1740 (m->type != FILE_PSTRING && (m->str_flags & PSTRING_LEN) != 0)) { in string_modifier_check()
1742 "'/BHhLl' modifiers are only allowed for pascal strings\n"); in string_modifier_check()
1743 return -1; in string_modifier_check()
1745 switch (m->type) { in string_modifier_check()
1748 if (m->str_flags != 0) { in string_modifier_check()
1750 "no modifiers allowed for 16-bit strings\n"); in string_modifier_check()
1751 return -1; in string_modifier_check()
1756 if ((m->str_flags & REGEX_OFFSET_START) != 0) { in string_modifier_check()
1760 return -1; in string_modifier_check()
1764 if (m->str_range == 0) { in string_modifier_check()
1768 m->str_range = STRING_DEFAULT_RANGE; in string_modifier_check()
1769 return -1; in string_modifier_check()
1773 if ((m->str_flags & STRING_COMPACT_WHITESPACE) != 0) { in string_modifier_check()
1776 return -1; in string_modifier_check()
1778 if ((m->str_flags & STRING_COMPACT_OPTIONAL_WHITESPACE) != 0) { in string_modifier_check()
1781 return -1; in string_modifier_check()
1785 file_magwarn(ms, "coding error: m->type=%d\n", in string_modifier_check()
1786 m->type); in string_modifier_check()
1787 return -1; in string_modifier_check()
1804 case '-': in get_op()
1813 return -1; in get_op()
1833 for (p = cond_tbl; p->len; p++) { in get_cond()
1834 if (strncmp(l, p->name, p->len) == 0 && in get_cond()
1835 isspace(CAST(unsigned char, l[p->len]))) { in get_cond()
1837 *t = l + p->len; in get_cond()
1841 return p->cond; in get_cond()
1848 last_cond = ms->c.li[cont_level].last_cond; in check_cond()
1853 if (ms->flags & MAGIC_CHECK) in check_cond()
1855 return -1; in check_cond()
1862 if (ms->flags & MAGIC_CHECK) in check_cond()
1864 return -1; in check_cond()
1871 if (ms->flags & MAGIC_CHECK) in check_cond()
1873 return -1; in check_cond()
1883 ms->c.li[cont_level].last_cond = last_cond; in check_cond()
1896 m->str_flags |= INDIRECT_RELATIVE; in parse_indirect_modifier()
1899 if (ms->flags & MAGIC_CHECK) in parse_indirect_modifier()
1903 return -1; in parse_indirect_modifier()
1918 m->mask_op |= op; in parse_op_modifier()
1921 m->num_mask = file_signextend(ms, m, val); in parse_op_modifier()
1939 if (have_range && (ms->flags & MAGIC_CHECK)) in parse_string_modifier()
1942 m->str_range = CAST(uint32_t, strtoul(l, &t, 0)); in parse_string_modifier()
1943 if (m->str_range == 0) in parse_string_modifier()
1945 l = t - 1; in parse_string_modifier()
1948 m->str_flags |= STRING_COMPACT_WHITESPACE; in parse_string_modifier()
1951 m->str_flags |= STRING_COMPACT_OPTIONAL_WHITESPACE; in parse_string_modifier()
1954 m->str_flags |= STRING_IGNORE_LOWERCASE; in parse_string_modifier()
1957 m->str_flags |= STRING_IGNORE_UPPERCASE; in parse_string_modifier()
1960 m->str_flags |= REGEX_OFFSET_START; in parse_string_modifier()
1963 m->str_flags |= STRING_BINTEST; in parse_string_modifier()
1966 m->str_flags |= STRING_TEXTTEST; in parse_string_modifier()
1969 m->str_flags |= STRING_TRIM; in parse_string_modifier()
1972 m->str_flags |= STRING_FULL_WORD; in parse_string_modifier()
1975 #define SET_LENGTH(a) m->str_flags = (m->str_flags & ~PSTRING_LEN) | (a) in parse_string_modifier()
1976 if (m->type != FILE_PSTRING) in parse_string_modifier()
1981 if (m->type != FILE_PSTRING) in parse_string_modifier()
1986 if (m->type != FILE_PSTRING) in parse_string_modifier()
1991 if (m->type != FILE_PSTRING) in parse_string_modifier()
1996 switch (m->type) { in parse_string_modifier()
2006 if (m->type != FILE_PSTRING) in parse_string_modifier()
2008 m->str_flags |= PSTRING_LENGTH_INCLUDES_ITSELF; in parse_string_modifier()
2012 if (ms->flags & MAGIC_CHECK) in parse_string_modifier()
2021 if (string_modifier_check(ms, m) == -1) in parse_string_modifier()
2027 return -1; in parse_string_modifier()
2059 if (file_check_mem(ms, cont_level) == -1) in parse()
2060 return -1; in parse()
2064 if (me->mp == NULL) { in parse()
2066 return -1; in parse()
2068 if (me->cont_count == 0) { in parse()
2070 return -1; in parse()
2072 m = &me->mp[me->cont_count - 1]; in parse()
2073 diff = CAST(int32_t, cont_level) - CAST(int32_t, m->cont_level); in parse()
2077 m->cont_level); in parse()
2078 if (me->cont_count == me->max_count) { in parse()
2080 size_t cnt = me->max_count + ALLOC_CHUNK; in parse()
2081 if ((nm = CAST(struct magic *, realloc(me->mp, in parse()
2084 return -1; in parse()
2086 me->mp = nm; in parse()
2087 me->max_count = CAST(uint32_t, cnt); in parse()
2089 m = &me->mp[me->cont_count++]; in parse()
2091 m->cont_level = cont_level; in parse()
2094 if (me->mp != NULL) in parse()
2098 return -1; in parse()
2100 me->mp = m; in parse()
2101 me->max_count = ALLOC_CHUNK; in parse()
2103 m->factor_op = FILE_FACTOR_OP_NONE; in parse()
2104 m->cont_level = 0; in parse()
2105 me->cont_count = 1; in parse()
2107 m->lineno = CAST(uint32_t, lineno); in parse()
2109 if (*l == '&') { /* m->cont_level == 0 checked below. */ in parse()
2111 m->flag |= OFFADD; in parse()
2115 m->flag |= INDIR; in parse()
2116 if (m->flag & OFFADD) in parse()
2117 m->flag = (m->flag & ~OFFADD) | INDIROFFADD; in parse()
2119 if (*l == '&') { /* m->cont_level == 0 checked below */ in parse()
2121 m->flag |= OFFADD; in parse()
2125 if (m->cont_level == 0 && (m->flag & (OFFADD | INDIROFFADD))) { in parse()
2126 if (ms->flags & MAGIC_CHECK) in parse()
2128 return -1; in parse()
2132 if (*l == '-' || *l == '+') { in parse()
2134 m->flag |= l[-1] == '-' ? OFFNEGATIVE : OFFPOSITIVE; in parse()
2136 m->offset = CAST(int32_t, strtol(l, &t, 0)); in parse()
2138 if (ms->flags & MAGIC_CHECK) in parse()
2140 return -1; in parse()
2145 if (m->flag & INDIR) { in parse()
2146 m->in_type = FILE_LONG; in parse()
2147 m->in_offset = 0; in parse()
2148 m->in_op = 0; in parse()
2150 * read [.,lbs][+-]nnnnn) in parse()
2154 m->in_op |= FILE_OPSIGNED; in parse()
2158 m->in_type = FILE_LELONG; in parse()
2161 m->in_type = FILE_BELONG; in parse()
2164 m->in_type = FILE_MELONG; in parse()
2168 m->in_type = FILE_LESHORT; in parse()
2172 m->in_type = FILE_BESHORT; in parse()
2178 m->in_type = FILE_BYTE; in parse()
2183 m->in_type = FILE_LEDOUBLE; in parse()
2188 m->in_type = FILE_BEDOUBLE; in parse()
2191 m->in_type = FILE_LEID3; in parse()
2194 m->in_type = FILE_BEID3; in parse()
2197 m->in_type = FILE_OCTAL; in parse()
2200 m->in_type = FILE_LEQUAD; in parse()
2203 m->in_type = FILE_BEQUAD; in parse()
2206 if (ms->flags & MAGIC_CHECK) in parse()
2210 return -1; in parse()
2216 m->in_op |= FILE_OPINVERSE; in parse()
2219 if ((op = get_op(*l)) != -1) { in parse()
2220 m->in_op |= op; in parse()
2224 m->in_op |= FILE_OPINDIRECT; in parse()
2227 if (isdigit(CAST(unsigned char, *l)) || *l == '-') { in parse()
2228 m->in_offset = CAST(int32_t, strtol(l, &t, 0)); in parse()
2230 if (ms->flags & MAGIC_CHECK) in parse()
2233 return -1; in parse()
2238 ((m->in_op & FILE_OPINDIRECT) && *l++ != ')')) { in parse()
2239 if (ms->flags & MAGIC_CHECK) in parse()
2242 return -1; in parse()
2248 m->cond = get_cond(l, &l); in parse()
2249 if (check_cond(ms, m->cond, cont_level) == -1) in parse()
2250 return -1; in parse()
2264 m->type = get_type(type_tbl, l + 1, &l); in parse()
2265 if (m->type == FILE_INVALID) { in parse()
2270 m->type = get_standard_integer_type(l, &l); in parse()
2273 if (m->type != FILE_INVALID) in parse()
2274 m->flag |= UNSIGNED; in parse()
2282 m->type = get_type(type_tbl, l, &l); in parse()
2283 if (m->type == FILE_INVALID) { in parse()
2290 m->type = get_standard_integer_type(l, &l); in parse()
2293 m->type = FILE_STRING; in parse()
2299 if (m->type == FILE_INVALID) { in parse()
2300 /* Not found - try it as a special keyword. */ in parse()
2301 m->type = get_type(special_tbl, l, &l); in parse()
2304 if (m->type == FILE_INVALID) { in parse()
2305 if (ms->flags & MAGIC_CHECK) in parse()
2307 return -1; in parse()
2310 if (m->type == FILE_NAME && cont_level != 0) { in parse()
2311 if (ms->flags & MAGIC_CHECK) in parse()
2314 return -1; in parse()
2317 /* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */ in parse()
2318 /* New and improved: ~ & | ^ + - * / % -- exciting, isn't it? */ in parse()
2320 m->mask_op = 0; in parse()
2322 if (!IS_STRING(m->type)) in parse()
2323 m->mask_op |= FILE_OPINVERSE; in parse()
2324 else if (ms->flags & MAGIC_CHECK) in parse()
2328 m->str_range = 0; in parse()
2329 m->str_flags = m->type == FILE_PSTRING ? PSTRING_1_LE : 0; in parse()
2330 if ((op = get_op(*l)) != -1) { in parse()
2331 if (IS_STRING(m->type)) { in parse()
2335 if (ms->flags & MAGIC_CHECK) in parse()
2339 return -1; in parse()
2342 if (m->type == FILE_INDIRECT) in parse()
2346 if (r == -1) in parse()
2347 return -1; in parse()
2361 m->reln = *l; in parse()
2364 if (ms->flags & MAGIC_CHECK) { in parse()
2366 m->reln); in parse()
2367 return -1; in parse()
2372 /* Old-style anding: "0 byte &0x80 dynamically linked" */ in parse()
2376 m->reln = *l; in parse()
2384 m->reln = *l; in parse()
2388 m->reln = '='; /* the default relation */ in parse()
2391 m->reln = *l; in parse()
2399 if (m->reln != 'x' && getvalue(ms, m, &l, action)) in parse()
2400 return -1; in parse()
2404 * #define offsetcheck {if (offset > ms->bytes_max -1) in parse()
2409 * Now get last part - the description in parse()
2414 m->flag |= NOSPACE; in parse()
2418 m->flag |= NOSPACE; in parse()
2420 for (i = 0; (m->desc[i++] = *l++) != '\0' && i < sizeof(m->desc); ) in parse()
2422 if (m->desc[0] == '\0') { in parse()
2424 strlcpy(m->desc + 1, file, sizeof(m->desc) - 1); in parse()
2426 if (i == sizeof(m->desc)) { in parse()
2427 m->desc[sizeof(m->desc) - 1] = '\0'; in parse()
2428 if (ms->flags & MAGIC_CHECK) in parse()
2429 file_magwarn(ms, "description `%s' truncated", m->desc); in parse()
2436 if (ms->flags & MAGIC_CHECK) { in parse()
2437 if (check_format(ms, m) == -1) in parse()
2438 return -1; in parse()
2445 m->mimetype[0] = '\0'; /* initialise MIME type to none */ in parse()
2450 * parse a STRENGTH annotation line from magic file, put into magic[index - 1]
2462 struct magic *m = &me->mp[0]; in parse_strength()
2464 if (m->factor_op != FILE_FACTOR_OP_NONE) { in parse_strength()
2467 m->factor_op, m->factor); in parse_strength()
2468 return -1; in parse_strength()
2470 if (m->type == FILE_NAME) { in parse_strength()
2473 file_printable(ms, sbuf, sizeof(sbuf), m->value.s, in parse_strength()
2474 sizeof(m->value.s))); in parse_strength()
2475 return -1; in parse_strength()
2485 m->factor_op = *l++; in parse_strength()
2489 return -1; in parse_strength()
2501 m->factor = CAST(uint8_t, factor); in parse_strength()
2502 if (m->factor == 0 && m->factor_op == FILE_FACTOR_OP_DIV) { in parse_strength()
2504 m->factor_op, m->factor); in parse_strength()
2509 m->factor_op = FILE_FACTOR_OP_NONE; in parse_strength()
2510 m->factor = 0; in parse_strength()
2511 return -1; in parse_strength()
2527 struct magic *m = &me->mp[me->cont_count == 0 ? 0 : me->cont_count - 1]; in parse_extra()
2534 return -1; in parse_extra()
2537 if (*m->desc == '\0') { in parse_extra()
2540 return -1; in parse_extra()
2550 buf[len - 1] = '\0'; in parse_extra()
2551 if (ms->flags & MAGIC_CHECK) in parse_extra()
2566 return -1; in parse_extra()
2571 * magic[index - 1]
2579 sizeof(me->mp[me->cont_count - 1].apple), "APPLE", "!+-./?", 0); in parse_apple()
2583 * Parse a comma-separated list of extensions
2591 sizeof(me->mp[me->cont_count - 1].ext), "EXTENSION", ",!+-/@?_$&~", in parse_ext()
2598 * parse a MIME annotation line from magic file, put into magic[index - 1]
2607 sizeof(me->mp[me->cont_count - 1].mimetype), "MIME", "+-/.$?:{};=", in parse_mime()
2619 return -1; in check_format_type()
2652 while (*ptr && strchr("-.#", *ptr) != NULL) in check_format_type()
2656 len = len * 10 + (*ptr - '0'); \ in check_format_type()
2695 if (h-- <= 0) in check_format_type()
2699 if (h-- <= 0) in check_format_type()
2748 if (*ptr == '-') in check_format_type()
2771 if (*ptr == '-') in check_format_type()
2795 return -1; in check_format_type()
2798 return -1; in check_format_type()
2811 for (ptr = m->desc; *ptr; ptr++) in check_format()
2821 if (m->type >= file_nformats) { in check_format()
2823 "m->type and format strings"); in check_format()
2824 return -1; in check_format()
2826 if (file_formats[m->type] == FILE_FMT_NONE) { in check_format()
2828 "`%s'", m->desc, file_names[m->type]); in check_format()
2829 return -1; in check_format()
2833 if (check_format_type(ptr, m->type, &estr) == -1) { in check_format()
2840 file_names[m->type], m->desc); in check_format()
2841 return -1; in check_format()
2849 file_names[m->type], m->desc); in check_format()
2850 return -1; in check_format()
2859 * just after the number read. Return 0 for success, non-zero for failure.
2868 switch (m->type) { in getvalue()
2881 if (ms->flags & MAGIC_CHECK) in getvalue()
2883 m->value.s); in getvalue()
2884 return -1; in getvalue()
2886 if (m->type == FILE_REGEX) { in getvalue()
2889 file_regcomp(ms, &rx, m->value.s, REG_EXTENDED); in getvalue()
2893 return rc ? -1 : 0; in getvalue()
2897 if (m->reln == 'x') in getvalue()
2902 switch (m->type) { in getvalue()
2908 m->value.f = strtof(*p, &ep); in getvalue()
2910 m->value.f = (float)strtod(*p, &ep); in getvalue()
2919 m->value.d = strtod(*p, &ep); in getvalue()
2924 if (file_parse_guid(*p, m->value.guid) == -1) in getvalue()
2925 return -1; in getvalue()
2926 *p += FILE_GUID_SIZE - 1; in getvalue()
2931 m->value.q = file_signextend(ms, m, ull); in getvalue()
2934 return -1; in getvalue()
2936 size_t ts = typesize(m->type); in getvalue()
2943 type_tbl[m->type].name); in getvalue()
2944 return -1; in getvalue()
2948 if (*q == '-' && ull != UINT64_MAX) in getvalue()
2949 ull = -CAST(int64_t, ull); in getvalue()
2974 type_tbl[m->type].name, ull); in getvalue()
2975 return -1; in getvalue()
2989 * Copy the converted version to "m->value.s", and the length in m->vallen.
2996 char *p = m->value.s; in getstr()
2997 size_t plen = sizeof(m->value.s); in getstr()
2999 char *pmax = p + plen - 1; in getstr() local
3007 if (p >= pmax) { in getstr()
3016 bracket_nesting--; in getstr()
3026 s--; in getstr()
3029 if (m->type == FILE_REGEX && in getstr()
3049 && (m->type != FILE_REGEX || in getstr()
3123 val = c - '0'; in getstr()
3126 val = (val << 3) | (c - '0'); in getstr()
3129 val = (val << 3) | (c-'0'); in getstr()
3131 --s; in getstr()
3134 --s; in getstr()
3148 --s; in getstr()
3150 --s; in getstr()
3155 --s; in getstr()
3158 m->vallen = CAST(unsigned char, (p - origp)); in getstr()
3159 if (m->type == FILE_PSTRING) { in getstr()
3163 m->vallen += CAST(unsigned char, l); in getstr()
3169 /* Single hex char to int; -1 if not a hex char. */
3174 return -1; in hextoint()
3176 return c - '0'; in hextoint()
3178 return c + 10 - 'a'; in hextoint()
3180 return c + 10 - 'A'; in hextoint()
3181 return -1; in hextoint()
3200 if (len-- == 0) in file_showstr()
3283 map->len = len; in apprentice_buf()
3284 map->p = buf; in apprentice_buf()
3285 map->type = MAP_TYPE_USER; in apprentice_buf()
3306 fd = -1; in apprentice_map()
3311 map->type = MAP_TYPE_USER; /* unspecified */ in apprentice_map()
3317 if ((fd = open(dbname, O_RDONLY|O_BINARY)) == -1) in apprentice_map()
3320 if (fstat(fd, &st) == -1) { in apprentice_map()
3330 map->len = CAST(size_t, st.st_size); in apprentice_map()
3332 map->type = MAP_TYPE_MMAP; in apprentice_map()
3333 if ((map->p = mmap(0, CAST(size_t, st.st_size), PROT_READ|PROT_WRITE, in apprentice_map()
3339 map->type = MAP_TYPE_MALLOC; in apprentice_map()
3340 if ((map->p = CAST(void *, malloc(map->len))) == NULL) { in apprentice_map()
3341 file_oomem(ms, map->len); in apprentice_map()
3344 if (read(fd, map->p, map->len) != (ssize_t)map->len) { in apprentice_map()
3350 fd = -1; in apprentice_map()
3356 if (mprotect(map->p, CAST(size_t, st.st_size), PROT_READ) == -1) { in apprentice_map()
3366 if (fd != -1) in apprentice_map()
3381 entries = CAST(uint32_t, map->len / sizeof(struct magic)); in check_buffer()
3385 return -1; in check_buffer()
3387 if ((entries * sizeof(struct magic)) != map->len) { in check_buffer()
3390 dbname, map->len, sizeof(struct magic)); in check_buffer()
3391 return -1; in check_buffer()
3394 ptr = CAST(uint32_t *, map->p); in check_buffer()
3398 return -1; in check_buffer()
3411 return -1; in check_buffer()
3413 map->magic[0] = CAST(struct magic *, map->p) + 1; in check_buffer()
3417 map->nmagic[i] = swap4(ptr[i + 2]); in check_buffer()
3419 map->nmagic[i] = ptr[i + 2]; in check_buffer()
3420 if (i != MAGIC_SETS - 1) in check_buffer()
3421 map->magic[i + 1] = map->magic[i] + map->nmagic[i]; in check_buffer()
3422 nentries += map->nmagic[i]; in check_buffer()
3427 return -1; in check_buffer()
3431 byteswap(map->magic[i], map->nmagic[i]); in check_buffer()
3441 static const size_t nm = sizeof(*map->nmagic) * MAGIC_SETS; in apprentice_compile()
3442 static const size_t m = sizeof(**map->magic); in apprentice_compile()
3443 int fd = -1; in apprentice_compile()
3446 int rv = -1; in apprentice_compile()
3458 if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644)) == -1) in apprentice_compile()
3466 memcpy(hdr.h + 2, map->nmagic, nm); in apprentice_compile()
3474 len = m * map->nmagic[i]; in apprentice_compile()
3475 if (write(fd, map->magic[i], len) != CAST(ssize_t, len)) { in apprentice_compile()
3483 if (fd != -1) in apprentice_compile()
3509 for (p = ext + sizeof(ext) - 1; p >= ext && q >= fn; p--, q--) in mkdbname()
3520 if (ms->flags & MAGIC_MIME) { in mkdbname()
3521 if (asprintf(&buf, "%.*s.mime%s", CAST(int, q - fn), fn, ext) in mkdbname()
3524 if (access(buf, R_OK) != -1) { in mkdbname()
3525 ms->flags &= MAGIC_MIME_TYPE; in mkdbname()
3530 if (asprintf(&buf, "%.*s%s", CAST(int, q - fn), fn, ext) < 0) in mkdbname()
3535 ms->flags &= MAGIC_MIME_TYPE; in mkdbname()
3624 *l = c - us + 1; in file_varint2uintmax_t()
3625 for (; c >= us; c--) { in file_varint2uintmax_t()
3637 *l = c - us + 1; in file_varint2uintmax_t()
3649 m->cont_level = swap2(m->cont_level); in bs1()
3650 m->offset = swap4(CAST(uint32_t, m->offset)); in bs1()
3651 m->in_offset = swap4(CAST(uint32_t, m->in_offset)); in bs1()
3652 m->lineno = swap4(CAST(uint32_t, m->lineno)); in bs1()
3653 if (IS_STRING(m->type)) { in bs1()
3654 m->str_range = swap4(m->str_range); in bs1()
3655 m->str_flags = swap4(m->str_flags); in bs1()
3658 m->value.q = swap8(m->value.q); in bs1()
3659 m->num_mask = swap8(m->num_mask); in bs1()
3666 switch (m->str_flags & PSTRING_LEN) { in file_pstring_length_size()
3677 "(bad pascal string length %d)", in file_pstring_length_size()
3678 m->str_flags & PSTRING_LEN); in file_pstring_length_size()
3690 switch (m->str_flags & PSTRING_LEN) { in file_pstring_get_length()
3720 "(bad pascal string length %d)", in file_pstring_get_length()
3721 m->str_flags & PSTRING_LEN); in file_pstring_get_length()
3725 if (m->str_flags & PSTRING_LENGTH_INCLUDES_ITSELF) { in file_pstring_get_length()
3729 len -= l; in file_pstring_get_length()
3741 mlist = ms->mlist[1]; in file_magicfind()
3743 for (ml = mlist->next; ml != mlist; ml = ml->next) { in file_magicfind()
3744 struct magic *ma = ml->magic; in file_magicfind()
3745 for (i = 0; i < ml->nmagic; i++) { in file_magicfind()
3749 v->magic = &ma[i]; in file_magicfind()
3750 v->magic_rxcomp = &(ml->magic_rxcomp[i]); in file_magicfind()
3751 for (j = i + 1; j < ml->nmagic; j++) in file_magicfind()
3754 v->nmagic = j - i; in file_magicfind()
3759 return -1; in file_magicfind()