50 lines
1.7 KiB
Markdown
50 lines
1.7 KiB
Markdown
# c-sum — cross-platform C example
|
|
|
|
Minimal example: a C program that reads `N` then `N` integers and prints their
|
|
sum. Tested with `judge` across **gcc / clang / MSVC** on **Linux / Windows**,
|
|
with optional **valgrind** and **sanitizer** runs.
|
|
|
|
## Files
|
|
|
|
- `solution.c` — student-facing solution (could be what the student submits)
|
|
- `sum.jdg` — judge test suite
|
|
- `.gitea/workflows/judge.yml` — Gitea CI matrix
|
|
|
|
## Run locally
|
|
|
|
```sh
|
|
# Linux / macOS
|
|
CC=gcc judge sum.jdg .
|
|
CC=clang judge sum.jdg .
|
|
|
|
# With valgrind
|
|
judge sum.jdg . --wrapper="valgrind --error-exitcode=99 --leak-check=full -q"
|
|
|
|
# With ASan+UBSan build
|
|
CC=clang CFLAGS="-O1 -g -fsanitize=address,undefined" judge sum.jdg .
|
|
```
|
|
|
|
On Windows (inside an MSVC dev cmd shell), `build_windows` kicks in and
|
|
produces `solution.exe`, which the runner auto-detects.
|
|
|
|
## Notes about the `.jdg`
|
|
|
|
- `normalize_crlf = true` — Windows `printf` emits `\r\n`; we strip `\r` before
|
|
matching so the same expected outputs work on both platforms.
|
|
- `trim_trailing_ws = true` — forgives trailing spaces a student's output might
|
|
pick up (rare but annoying to debug).
|
|
- `binary = "solution"` — the runner tries `solution` first, then
|
|
`solution.exe` on Windows automatically.
|
|
- Per-group `scoring = all_or_none` on `stress` gives weight only if every
|
|
stress test passes.
|
|
|
|
## Adapting the Gitea workflow
|
|
|
|
- `runs-on: ${{ matrix.toolchain.system }}-Runner` assumes you have
|
|
self-hosted Gitea runners labelled `Linux-Runner` / `Windows-Runner` (same
|
|
naming as your existing `fixed_floating` pipeline).
|
|
- `secrets.VAR_TOKEN` is only needed when pulling a student repo from a
|
|
private org.
|
|
- The summary job shells `grep` over the JSON; swap to `jq` if available on
|
|
your runners.
|