diff options
author | Joseph Myers <joseph@codesourcery.com> | 2013-12-20 13:10:07 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2013-12-20 13:10:07 +0000 |
commit | 85bff96ad652b463f83d4cf19239eff1535e186a (patch) | |
tree | d651b5e72fe828f47613e6813ac5d54b0b7aaf66 /timezone/scheck.c | |
parent | b7867a3bfb9d7e00204c088feb227abddfc7bb43 (diff) | |
download | glibc-85bff96ad652b463f83d4cf19239eff1535e186a.tar.gz glibc-85bff96ad652b463f83d4cf19239eff1535e186a.tar.xz glibc-85bff96ad652b463f83d4cf19239eff1535e186a.zip |
Update timezone code from tzcode 2013i.
Now we have Paul's support for version-3 tz files checked in, this patch updates all the code we take (unmodified) from tzcode to version 2013i (which includes the support for generating version-3 tz files where necessary). Tested x86_64. * timezone/checktab.awk: Update from tzcode 2013i. * timezone/private.h: Likewise. * timezone/scheck.c: Likewise. * timezone/tzfile.h: Likewise. * timezone/tzselect.ksh: Likewise. * timezone/zdump.c: Likewise. * timezone/zic.c: Likewise.
Diffstat (limited to 'timezone/scheck.c')
-rw-r--r-- | timezone/scheck.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/timezone/scheck.c b/timezone/scheck.c index ed60980d83..8bd01a858f 100644 --- a/timezone/scheck.c +++ b/timezone/scheck.c @@ -25,26 +25,35 @@ scheck(const char *const string, const char *const format) return result; fp = format; tp = fbuf; + + /* + ** Copy directives, suppressing each conversion that is not + ** already suppressed. Scansets containing '%' are not + ** supported; e.g., the conversion specification "%[%]" is not + ** supported. Also, multibyte characters containing a + ** non-leading '%' byte are not supported. + */ while ((*tp++ = c = *fp++) != '\0') { if (c != '%') continue; - if (*fp == '%') { - *tp++ = *fp++; - continue; + if (is_digit(*fp)) { + char const *f = fp; + char *t = tp; + do { + *t++ = c = *f++; + } while (is_digit(c)); + if (c == '$') { + fp = f; + tp = t; + } } *tp++ = '*'; if (*fp == '*') ++fp; - while (is_digit(*fp)) - *tp++ = *fp++; - if (*fp == 'l' || *fp == 'h') - *tp++ = *fp++; - else if (*fp == '[') - do *tp++ = *fp++; - while (*fp != '\0' && *fp != ']'); if ((*tp++ = *fp++) == '\0') break; } + *(tp - 1) = '%'; *tp++ = 'c'; *tp = '\0'; |