Gart Gart - 7 days ago 4
C Question

Are triple dots inside a case (case '0' ... '9':) valid C language switch syntax?

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?

Answer

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.)

Comments