Every section banner dies (103 -> 0) across test/lang, the observer suites, the C carriers, and the five comment-heavy corpus fixtures; banner provenance (#N cites, carrier numbers, repair-cluster labels) folded into headers or adjacent WHY comments. Narration deleted; row provenance, ref cites, divergence pins, and layout contracts kept (fwd-ref decl-order guards and bootstrap-gate corpus rationale restored where the sweep over-cut). Comment-only proven: all 3742 wwbuild workdir .s byte-identical before/after; test-commit and test-byteid (161 lang + 1399 data, 0 pinned-divergent) green.
62 lines
1.6 KiB
C
62 lines
1.6 KiB
C
/*
|
|
* 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 <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
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
|