Ticket #41069: regex_osx.diff

File regex_osx.diff, 4.7 KB (added by suominen (Kimmo Suominen), 10 years ago)

fix regex errors on OS X; for file 5.17

  • ChangeLog

    RCS file: /p/file/cvsroot/file/ChangeLog,v
    retrieving revision 1.219
    retrieving revision 1.220
    diff -u -r1.219 -r1.220
     
     12014-02-18  13:04  Kimmo Suominen (kimmo@suominen.com)
     2
     3        * Cache old LC_CTYPE locale before setting it to "C", so
     4          we can use it to restore LC_CTYPE instead of asking
     5          setlocale() to scan the environment variables.
     6
    172014-02-12  18:21  Christos Zoulas <christos@zoulas.com>
    28
    39        * Count recursion levels through indirect magic
  • src/funcs.c

    RCS file: /p/file/cvsroot/file/src/funcs.c,v
    retrieving revision 1.67
    retrieving revision 1.68
    diff -u -r1.67 -r1.68
     
    2727#include "file.h"
    2828
    2929#ifndef lint
    30 FILE_RCSID("@(#)$File: funcs.c,v 1.67 2014/02/12 23:20:53 christos Exp $")
     30FILE_RCSID("@(#)$File: funcs.c,v 1.68 2014/02/18 11:09:31 kim Exp $")
    3131#endif  /* lint */
    3232
    3333#include "magic.h"
     34#include <assert.h>
    3435#include <stdarg.h>
    3536#include <stdlib.h>
    3637#include <string.h>
     
    442443{
    443444        regex_t rx;
    444445        int rc, rv = -1;
     446        char *old_lc_ctype;
    445447
     448        old_lc_ctype = setlocale(LC_CTYPE, NULL);
     449        assert(old_lc_ctype != NULL);
     450        old_lc_ctype = strdup(old_lc_ctype);
     451        assert(old_lc_ctype != NULL);
    446452        (void)setlocale(LC_CTYPE, "C");
    447453        rc = regcomp(&rx, pat, REG_EXTENDED);
    448454        if (rc) {
     
    463469                rv = nm;
    464470        }
    465471out:
    466         (void)setlocale(LC_CTYPE, "");
     472        (void)setlocale(LC_CTYPE, old_lc_ctype);
     473        free(old_lc_ctype);
    467474        return rv;
    468475}
  • src/readcdf.c

    RCS file: /p/file/cvsroot/file/src/readcdf.c,v
    retrieving revision 1.37
    retrieving revision 1.38
    diff -u -r1.37 -r1.38
     
    2626#include "file.h"
    2727
    2828#ifndef lint
    29 FILE_RCSID("@(#)$File: readcdf.c,v 1.37 2014/01/06 13:41:18 rrt Exp $")
     29FILE_RCSID("@(#)$File: readcdf.c,v 1.38 2014/02/18 11:09:31 kim Exp $")
    3030#endif
    3131
     32#include <assert.h>
    3233#include <stdlib.h>
    3334#include <unistd.h>
    3435#include <string.h>
     
    7475{
    7576        size_t i;
    7677        const char *rv = NULL;
     78        char *old_lc_ctype;
    7779
     80        old_lc_ctype = setlocale(LC_CTYPE, NULL);
     81        assert(old_lc_ctype != NULL);
     82        old_lc_ctype = strdup(old_lc_ctype);
     83        assert(old_lc_ctype != NULL);
    7884        (void)setlocale(LC_CTYPE, "C");
    7985        for (i = 0; nv[i].pattern != NULL; i++)
    8086                if (strcasestr(vbuf, nv[i].pattern) != NULL) {
    8187                        rv = nv[i].mime;
    8288                        break;
    8389                }
    84         (void)setlocale(LC_CTYPE, "");
     90        (void)setlocale(LC_CTYPE, old_lc_ctype);
     91        free(old_lc_ctype);
    8592        return rv;
    8693}
    8794
  • src/softmagic.c

    RCS file: /p/file/cvsroot/file/src/softmagic.c,v
    retrieving revision 1.174
    retrieving revision 1.176
    diff -u -r1.174 -r1.176
     
    3232#include "file.h"
    3333
    3434#ifndef lint
    35 FILE_RCSID("@(#)$File: softmagic.c,v 1.174 2014/02/12 23:20:53 christos Exp $")
     35FILE_RCSID("@(#)$File: softmagic.c,v 1.176 2014/02/18 17:59:21 kim Exp $")
    3636#endif  /* lint */
    3737
    3838#include "magic.h"
     
    4242#else
    4343#define F(a, b) (a)
    4444#endif
     45#include <assert.h>
    4546#include <string.h>
    4647#include <ctype.h>
    4748#include <stdlib.h>
     
    352353{
    353354        regex_t rx;
    354355        int rc, rv = -1;
     356        char *old_lc_ctype;
    355357
    356358        if (strchr(m->desc, '%') == NULL)
    357359                return 0;
    358360
     361        old_lc_ctype = setlocale(LC_CTYPE, NULL);
     362        assert(old_lc_ctype != NULL);
     363        old_lc_ctype = strdup(old_lc_ctype);
     364        assert(old_lc_ctype != NULL);
    359365        (void)setlocale(LC_CTYPE, "C");
    360366        rc = regcomp(&rx, "%[-0-9\\.]*s", REG_EXTENDED|REG_NOSUB);
    361367        if (rc) {
     
    367373                regfree(&rx);
    368374                rv = !rc;
    369375        }
    370         (void)setlocale(LC_CTYPE, "");
     376        (void)setlocale(LC_CTYPE, old_lc_ctype);
     377        free(old_lc_ctype);
    371378        return rv;
    372379}
    373380
     
    18841891        double dl, dv;
    18851892        int matched;
    18861893        union VALUETYPE *p = &ms->ms_value;
     1894        char *old_lc_ctype;
    18871895
    18881896        switch (m->type) {
    18891897        case FILE_BYTE:
     
    20422050                if (ms->search.s == NULL)
    20432051                        return 0;
    20442052
     2053                old_lc_ctype = setlocale(LC_CTYPE, NULL);
     2054                assert(old_lc_ctype != NULL);
     2055                old_lc_ctype = strdup(old_lc_ctype);
     2056                assert(old_lc_ctype != NULL);
     2057                (void)setlocale(LC_CTYPE, "C");
    20452058                l = 0;
    20462059                rc = regcomp(&rx, m->value.s,
    20472060                    REG_EXTENDED|REG_NEWLINE|
     
    20902103                        }
    20912104                        regfree(&rx);
    20922105                }
     2106                (void)setlocale(LC_CTYPE, old_lc_ctype);
     2107                free(old_lc_ctype);
    20932108                if (v == (uint64_t)-1)
    20942109                        return -1;
    20952110                break;