Changeset 39f84ce4 in mainline for uspace/lib/c/generic/stdio/scanf.c


Ignore:
Timestamp:
2018-06-13T17:11:44Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f4aa1c8
Parents:
5a6c28d1
git-author:
Jiri Svoboda <jiri@…> (2018-06-12 18:11:08)
git-committer:
Jiri Svoboda <jiri@…> (2018-06-13 17:11:44)
Message:

Add range support to scanf's set conversion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/stdio/scanf.c

    r5a6c28d1 r39f84ce4  
    886886/** Determine if character is in scanset.
    887887 *
     888 * Note that we support ranges, although that is a GNU extension.
     889 *
    888890 * @param c Character
    889891 * @param scanset Pointer to scanset
     
    894896        const char *p = scanset;
    895897        bool inverted = false;
     898        char startc;
     899        char endc;
    896900
    897901        /* Inverted scanset */
     
    901905        }
    902906
    903         /* ']' character in scanset */
     907        /*
     908         * Either ']' or '-' at beginning or after '^' loses special meaning.
     909         * However, '-' after ']' (or vice versa) does not.
     910         */
    904911        if (*p == ']') {
     912                /* ']' character in scanset */
    905913                if (c == ']')
    906914                        return !inverted;
    907915                ++p;
     916        } else if (*p == '-') {
     917                /* '-' character in scanset */
     918                if (c == '-')
     919                        return !inverted;
     920                ++p;
    908921        }
    909922
    910923        /* Remaining characters */
    911924        while (*p != '\0' && *p != ']') {
     925                /* '-' is a range unless it's the last character in scanset */
     926                if (*p == '-' && p[1] != ']' && p[1] != '\0') {
     927                        startc = p[-1];
     928                        endc = p[1];
     929
     930                        if (c >= startc && c <= endc)
     931                                return !inverted;
     932
     933                        p += 2;
     934                        continue;
     935                }
     936
    912937                if (*p == c)
    913938                        return !inverted;
Note: See TracChangeset for help on using the changeset viewer.