Viewing file: 20111208-1.c (1.51 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* PR tree-optimization/51315 */ /* Reported by Jurij Smakov <jurij@wooyd.org> */
typedef __SIZE_TYPE__ size_t;
extern void *memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2)));
extern size_t strlen (__const char *__s) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
typedef __INT16_TYPE__ int16_t; typedef __INT32_TYPE__ int32_t;
extern void abort (void);
int a;
static void __attribute__ ((noinline,noclone)) do_something (int item) { a = item; }
int pack_unpack (char *s, char *p) { char *send, *pend; char type; int integer_size;
send = s + strlen (s); pend = p + strlen (p);
while (p < pend) { type = *p++;
switch (type) { case 's': integer_size = 2; goto unpack_integer;
case 'l': integer_size = 4; goto unpack_integer;
unpack_integer: switch (integer_size) { case 2: { union { int16_t i; char a[sizeof (int16_t)]; } v; memcpy (v.a, s, sizeof (int16_t)); s += sizeof (int16_t); do_something (v.i); } break;
case 4: { union { int32_t i; char a[sizeof (int32_t)]; } v; memcpy (v.a, s, sizeof (int32_t)); s += sizeof (int32_t); do_something (v.i); } break; } break; } } return (int) *s; }
int main (void) { int n = pack_unpack ("\200\001\377\376\035\300", "sl"); if (n != 0) abort (); return 0; }
|