/* * Strict-package (#24a) test support. * * Inline ww test fixtures historically omitted the `package main;` clause * that the parser now requires (a missing clause is a hard error). These * helpers inject it transparently so the fixtures stay terse, WITHOUT * disturbing fixtures that already declare their own module identity. * * wwtest_fputs is a drop-in for fputs(src, f): it prepends `package main;` * only when writing at the START of a fresh file (ftell == 0) AND the * fixture does not already open with its own `package`/`//ww:module` * directive. The ftell guard keeps multi-part writes and writes to * non-seekable streams (stderr) behaving exactly like plain fputs. */ #ifndef WWTESTPKG_H #define WWTESTPKG_H #include #include #include static inline int wwtest_has_module(const char *s) { const char *p = s; while (p != NULL) { while (*p == ' ' || *p == '\t') p++; if (strncmp(p, "package ", 8) == 0 || strncmp(p, "package\t", 8) == 0 || strncmp(p, "//ww:module", 11) == 0) return 1; p = strchr(p, '\n'); if (p != NULL) p++; } return 0; } static inline void wwtest_fputs(const char *src, FILE *f) { if (ftell(f) == 0 && !wwtest_has_module(src)) fputs("package main;\n", f); fputs(src, f); } /* In-process variant: a malloc'd copy of src with the clause prefixed * (unless src declares its own module). Caller frees. */ static inline char * wwtest_wrap(const char *src) { const char *pfx = wwtest_has_module(src) ? "" : "package main;\n"; size_t np = strlen(pfx), ns = strlen(src); char *b = malloc(np + ns + 1); memcpy(b, pfx, np); memcpy(b + np, src, ns + 1); return b; } #endif