Nexoniarz is the sole author and SchOS was never published under Apache-2.0, so this is a straight relicence. LICENSE is the FSF GPLv2 text, every first-party SPDX header moves to GPL-2.0-or-later, and NOTICE, README.md, docs/licensing.md and the site say so. projects/schfs-linux follows the rest of the tree. The GPL gives copyleft: a fork has to ship its source. It also lifts the old "Linux drivers, never" rule, since GPL-2.0-only code combines with GPL-2.0-or-later. "Or later" leaves room for GPLv3, but one binary still has to pick one version, so docs/licensing.md now keeps Apache-2.0 and GPLv3 code out of the kernel to keep Linux code possible there. BSD 4-clause code goes from "avoid" to "no", because the advertising clause is GPL-incompatible. LDLS still ships no .ko. That boundary is now project policy rather than a legal requirement, and ldls.md, devices.md and licensing.md section 6 say so. refmod declares license=GPL, and ldls-check passes (27 checks). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
1.6 KiB
C
82 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
//
|
|
// The bounded string builder. See include/sbuf.h for what it is and why it
|
|
// moved out of kernel/dev/procfs.c.
|
|
|
|
#include "types.h"
|
|
#include "sbuf.h"
|
|
|
|
void
|
|
sb_putc(struct sbuf *sb, char c)
|
|
{
|
|
if (sb->len < sb->cap - 1)
|
|
sb->p[sb->len++] = c;
|
|
}
|
|
|
|
void
|
|
sb_puts(struct sbuf *sb, const char *s)
|
|
{
|
|
while (*s)
|
|
sb_putc(sb, *s++);
|
|
}
|
|
|
|
void
|
|
sb_pad(struct sbuf *sb, const char *s, int width)
|
|
{
|
|
int n = 0;
|
|
while (s[n]) {
|
|
sb_putc(sb, s[n]);
|
|
n++;
|
|
}
|
|
while (n++ < width)
|
|
sb_putc(sb, ' ');
|
|
}
|
|
|
|
void
|
|
sb_puthex4(struct sbuf *sb, uint32 v)
|
|
{
|
|
static const char hex[] = "0123456789abcdef";
|
|
for (int i = 3; i >= 0; i--)
|
|
sb_putc(sb, hex[(v >> (i * 4)) & 0xF]);
|
|
}
|
|
|
|
void
|
|
sb_puthex(struct sbuf *sb, uint64 v, int digits)
|
|
{
|
|
static const char hex[] = "0123456789abcdef";
|
|
for (int i = digits - 1; i >= 0; i--)
|
|
sb_putc(sb, hex[(v >> (i * 4)) & 0xF]);
|
|
}
|
|
|
|
void
|
|
sb_putu(struct sbuf *sb, uint64 v)
|
|
{
|
|
char tmp[24];
|
|
int i = 0;
|
|
if (v == 0) { sb_putc(sb, '0'); return; }
|
|
while (v && i < (int)sizeof(tmp)) { tmp[i++] = '0' + (v % 10); v /= 10; }
|
|
while (i--) sb_putc(sb, tmp[i]);
|
|
}
|
|
|
|
void
|
|
sb_putu_pad(struct sbuf *sb, uint64 v, int width)
|
|
{
|
|
char tmp[24];
|
|
int i = 0, n;
|
|
|
|
if (v == 0) { tmp[i++] = '0'; }
|
|
while (v && i < (int)sizeof(tmp)) { tmp[i++] = '0' + (v % 10); v /= 10; }
|
|
for (n = i; n < width; n++)
|
|
sb_putc(sb, ' ');
|
|
while (i--)
|
|
sb_putc(sb, tmp[i]);
|
|
}
|
|
|
|
void
|
|
sb_kv(struct sbuf *sb, const char *label, uint64 v, const char *unit)
|
|
{
|
|
sb_puts(sb, label);
|
|
sb_putu(sb, v);
|
|
if (unit && *unit) { sb_putc(sb, ' '); sb_puts(sb, unit); }
|
|
sb_putc(sb, '\n');
|
|
}
|