On Wed, Apr 08, 2020 at 02:39:39PM +0200, Gerd Hoffmann wrote:
+again:
- switch (ptr[offset]) {
- case 0: /* null name */
offset++;
*(dst++) = 0;
break;
[ ... ]
- case '^':
*(dst++) = '^';
offset++;
goto again;
I think this code would be more clear if it used "for (;;) {" and "continue" instead of a backwards goto.
Hmm, doesn't help that much due to for + switch nesting. I would need either an additional state variable or use goto to jump from inside switch out of the for loop. Both ways don't make things more clear compared to the current state ...
static int parse_namestring(struct parse_state *s, u8 *ptr, const char *item) { char *dst = s->name; int offset = 0; int i, count;
for (;;) { switch (ptr[offset]) { case 0: /* null name */ offset++; *(dst++) = 0; break; case 0x2e: offset++; offset += parse_nameseg(ptr + offset, &dst); *(dst++) = '.'; offset += parse_nameseg(ptr + offset, &dst); break; case 0x2f: offset++; count = ptr[offset]; offset++; for (i = 0; i < count; i++) { if (i) *(dst++) = '.'; offset += parse_nameseg(ptr + offset, &dst); } break; case '\': *(dst++) = '\'; offset++; continue; case '^': *(dst++) = '^'; offset++; continue; case 'A' ... 'Z': case '_': offset += parse_nameseg(ptr, &dst); break; default: hex(ptr, 16, 3, __func__); s->error = 1; break; } break; } dprintf(5, "%s: %d %s '%s'\n", __func__, s->depth, item, s->name); return offset; }
-Kevin