Skip to content

Commit

Permalink
Add interface struct declarations
Browse files Browse the repository at this point in the history
  • Loading branch information
nigeltao committed Jan 6, 2020
1 parent 5bf070b commit 4c9be03
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 8 deletions.
1 change: 1 addition & 0 deletions doc/changelog.md
Expand Up @@ -3,6 +3,7 @@

## Work In Progress

- Added interfaces.
- Renamed warnings to notes.
- Made `wuffs_base__pixel_format` a struct.
- Made `wuffs_base__pixel_subsampling` a struct.
Expand Down
4 changes: 4 additions & 0 deletions internal/cgen/base/all-impl.c
Expand Up @@ -42,6 +42,8 @@ extern "C" {

// !! INSERT base/all-public.h.

// !! INSERT InterfaceDeclarations.

#ifdef __cplusplus
} // extern "C"
#endif
Expand Down Expand Up @@ -112,6 +114,8 @@ const uint64_t wuffs_base__low_bits_mask__u64[65] = {

// !! INSERT wuffs_base__status strings.

// !! INSERT InterfaceDefinitions.

// !! INSERT base/image-impl.c.

#endif // !defined(WUFFS_CONFIG__MODULES) ||
Expand Down
66 changes: 62 additions & 4 deletions internal/cgen/cgen.go
Expand Up @@ -117,10 +117,12 @@ func Do(args []string) error {
}
buf := make(buffer, 0, 128*1024)
if err := expandBangBangInsert(&buf, baseAllImplC, map[string]func(*buffer) error{
"// !! INSERT base/all-private.h.\n": insertBaseAllPrivateH,
"// !! INSERT base/all-public.h.\n": insertBaseAllPublicH,
"// !! INSERT base/copyright\n": insertBaseCopyright,
"// !! INSERT base/image-impl.c.\n": insertBaseImageImplC,
"// !! INSERT InterfaceDeclarations.\n": insertInterfaceDeclarations,
"// !! INSERT InterfaceDefinitions.\n": insertInterfaceDefinitions,
"// !! INSERT base/all-private.h.\n": insertBaseAllPrivateH,
"// !! INSERT base/all-public.h.\n": insertBaseAllPublicH,
"// !! INSERT base/copyright\n": insertBaseCopyright,
"// !! INSERT base/image-impl.c.\n": insertBaseImageImplC,
"// !! INSERT wuffs_base__status strings.\n": func(b *buffer) error {
for _, z := range builtin.Statuses {
msg, _ := t.Unescape(z)
Expand Down Expand Up @@ -322,6 +324,62 @@ func insertBaseImageImplC(buf *buffer) error {
return nil
}

func insertInterfaceDeclarations(buf *buffer) error {
buf.writes("// ---------------- Interface Declarations.\n\n")
for _, n := range builtin.Interfaces {
buf.printf("extern const char* wuffs_base__%s__vtable_name;\n", n)
buf.writeb('\n')

buf.printf("typedef struct wuffs_base__%s__struct wuffs_base__%s;\n", n, n)
buf.writeb('\n')

buf.writes("#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)\n\n")

buf.printf("struct wuffs_base__%s__struct {", n)
buf.writes(`
#ifdef WUFFS_IMPLEMENTATION
struct {
uint32_t magic;
uint32_t active_coroutine;
wuffs_base__vtable first_vtable;
} private_impl;
#else // WUFFS_IMPLEMENTATION
private:
union {
uint32_t align_as_per_magic_field;
uint8_t placeholder[1073741824]; // 1 GiB.
} private_impl WUFFS_BASE__POTENTIALLY_UNUSED_FIELD;
public:
#endif // WUFFS_IMPLEMENTATION
`)

buf.writes("\n#ifdef __cplusplus\n\n")
// TODO: C++ methods.
buf.writes("#endif // __cplusplus\n\n")

buf.printf("}; // struct wuffs_base__%s__struct\n\n", n)

buf.writes("#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)\n\n")
}
return nil
}

func insertInterfaceDefinitions(buf *buffer) error {
buf.writes("// ---------------- Interface Definitions.\n\n")
for _, n := range builtin.Interfaces {
buf.printf("const char* wuffs_base__%s__vtable_name = "+
"\"{vtable}wuffs_base__%s\";\n", n, n)
}
buf.writeb('\n')

return nil
}

type gen struct {
pkgPrefix string // e.g. "wuffs_jpeg__"
pkgName string // e.g. "jpeg"
Expand Down
8 changes: 4 additions & 4 deletions internal/cgen/data.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions lang/builtin/builtin.go
Expand Up @@ -337,6 +337,10 @@ var Funcs = []string{
"dst: slice u8, dst_palette: slice u8, src: slice u8) u64",
}

var Interfaces = []string{
"hasher_u32",
}

// The "T1" and "T2" types here are placeholders for generic "slice T" or
// "table T" types. After tokenizing (but before parsing) these XxxFunc strings
// (e.g. in the lang/check package), replace "T1" and "T2" with "†" or "‡"
Expand Down
42 changes: 42 additions & 0 deletions release/c/wuffs-unsupported-snapshot.c
Expand Up @@ -2563,6 +2563,43 @@ wuffs_base__pixel_swizzler::swizzle_interleaved(

#endif // __cplusplus

// ---------------- Interface Declarations.

extern const char* wuffs_base__hasher_u32__vtable_name;

typedef struct wuffs_base__hasher_u32__struct wuffs_base__hasher_u32;

#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)

struct wuffs_base__hasher_u32__struct {
#ifdef WUFFS_IMPLEMENTATION

struct {
uint32_t magic;
uint32_t active_coroutine;
wuffs_base__vtable first_vtable;
} private_impl;

#else // WUFFS_IMPLEMENTATION

private:
union {
uint32_t align_as_per_magic_field;
uint8_t placeholder[1073741824]; // 1 GiB.
} private_impl WUFFS_BASE__POTENTIALLY_UNUSED_FIELD;

public:

#endif // WUFFS_IMPLEMENTATION

#ifdef __cplusplus

#endif // __cplusplus

}; // struct wuffs_base__hasher_u32__struct

#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)

#ifdef __cplusplus
} // extern "C"
#endif
Expand Down Expand Up @@ -4656,6 +4693,11 @@ const char* wuffs_base__error__not_enough_data = "#base: not enough data";
const char* wuffs_base__error__unsupported_option = "#base: unsupported option";
const char* wuffs_base__error__too_much_data = "#base: too much data";

// ---------------- Interface Definitions.

const char* wuffs_base__hasher_u32__vtable_name =
"{vtable}wuffs_base__hasher_u32";

// ---------------- Images

const uint32_t wuffs_base__pixel_format__bits_per_channel[16] = {
Expand Down

0 comments on commit 4c9be03

Please sign in to comment.