17

I noticed this in open source code files for DRBD software (user/drbdtool_common.c)

const char* shell_escape(const char* s)
{
    /* ugly static buffer. so what. */
    static char buffer[1024];
    char *c = buffer;

    if (s == NULL)
        return s;

    while (*s) {
        if (buffer + sizeof(buffer) < c+2)
            break;

        switch(*s) {
        /* set of 'clean' characters */
        case '%': case '+': case '-': case '.': case '/':
        case '0' ... '9':
        case ':': case '=': case '@':
        case 'A' ... 'Z':
        case '_':
        case 'a' ... 'z':
            break;
        /* escape everything else */
        default:
            *c++ = '\\';
        }
        *c++ = *s++;
    }
    *c = '\0';
    return buffer;
}

I have never seen this "triple dot" construction (case '0' ... '9':) in C before. Is it a valid standard C language? Or is that some kind of preprocessor magic? What's going on here?

Ebrahim Byagowi
  • 10,338
  • 4
  • 70
  • 81
Gart
  • 2,297
  • 1
  • 28
  • 36
  • 2
    for the interested it is standard in the [D programming language](http://www.d-programming-language.org/statement.html#SwitchStatement) – ratchet freak Aug 12 '11 at 20:48
  • It is supported on clang also FWIW. – Ebrahim Byagowi Nov 29 '16 at 10:55
  • [what does this syntax of switch case mean in C?](https://stackoverflow.com/q/17699746/995714), [Are Elipses in case statements standard C/C++](https://stackoverflow.com/q/5924681/995714) – phuclv Jan 22 '20 at 07:22

4 Answers4

12

That's a non-standard language extension.

Probably GCC: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html.

Oliver Charlesworth
  • 267,707
  • 33
  • 569
  • 680
10

As others have said, this is a compiler-specific extension. Invoke the compiler with the right options (say, gcc -std=c99 -pedantic), and it should warn you about it.

I'll also point out that its use is potentially dangerous, apart from the fact that another compiler might not implement it. 'a' ... 'z' denotes the 26 lowercase letters -- but the C Standard doesn't guarantee that their values are contiguous. In EBCDIC, for example, there are punctuation characters among the letters.

On the other hand, I doubt that either gcc or Sun C supports systems that use a character set in which the letters aren't contiguous. (They are in ASCII and all its derivatives, including Latin-1, Windows-1252, and Unicode.)

On the other other hand, it excludes accented letters. (Depending on how DRBD is used, that may or may not be an issue.)

Keith Thompson
  • 254,901
  • 44
  • 429
  • 631
3

No, this is an extension of GCC.

MByD
  • 135,866
  • 28
  • 264
  • 277
3

This is not standard C, but is an extension found in the Sun C compiler.

Refer to: 2.7 Case Ranges in Switch Statements at Oracle's web site.

UPDATE: Apparently, not just Oracle! :-)

Michael Hays
  • 6,878
  • 2
  • 21
  • 17