nested-structs/arrays (C)
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 28/100
- Issue-Typ
- Feature
- Klarheit
- Muss geklärt werden
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- c, javascript
- Bereich
- tooling
Rechercherichtung
Beginne mit tools/gen_lib.js rund um die Schleife zur Struct-Generierung und überprüfe die Struct-Felder von api.json, insbesondere die Array- und verschachtelten Struct-Typen, die derzeit übersprungen werden. Prüfe zuerst Issue #9 und inspiziere anschließend die generierten src/structs.h und src/lib.c; abgeschlossen ist die Aufgabe, wenn diese Felder in den generierten Utilities nicht mehr stillschweigend ausgelassen werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
I am currently skipping these in C codegen. They should be addressed, once I figure out #9
https://github.com/konsumer/raylib-pointers/blob/f365325/tools/gen_lib.js#L22
// this will generate raylib-pointers
import { writeFile } from 'fs/promises'
import api from './api.json'
const { structs, wrapped } = api
let out = []
// build utils for structs
for (const { name, description, fields } of structs) {
out.push(`// ${description}
unsigned int ${name}_size() {
return sizeof(${name});
}`)
for (const field of fields) {
if (field.type.includes('[')) {
// TODO: add utils for arrays
} else if (/^[A-Z]/.test(field.type)) {
// cheap way to detect raylib types
// TODO: add utils for nested structs
} else {
out.push(`${field.type} ${name}_get_${field.name}(${name}* p) {\n return p->${field.name};\n}`)
out.push(`void ${name}_set_${field.name}(${name}* p, ${field.type} v) {\n p->${field.name} = v;\n}`)
}
}
out.push('')
}
await writeFile('src/structs.h', out.join('\n'))
out = [
`#include <stdlib.h>
#include "raylib.h"
// utils for operating on structs
#include "./structs.h"
// this allows us to free anything that was allocated, last-frame
// max number of allocations you can do, per-frame
#define FRAME_ALLOC_SIZE 1024*512
int _frame_alloc_counter = 0;
void* _frame_allocated[FRAME_ALLOC_SIZE] = {};
bool running = false;
void* wrapped_alloc(size_t s) {
void* p = RL_MALLOC(s);
if (running) {
_frame_allocated[_frame_alloc_counter] = p;
_frame_alloc_counter = (_frame_alloc_counter + 1) % FRAME_ALLOC_SIZE;
}
return p;
}
void wrapped_free(void* p) {
RL_FREE(p);
}
bool wrapped_WindowShouldClose() {
running = true;
for (int i=0;i<_frame_alloc_counter;i++) {
wrapped_free(_frame_allocated[i]);
}
_frame_alloc_counter = 0;
return WindowShouldClose();
}
`
]
// these will not be ghenerated for
const blocklist = [
// I will be implementing my own mem-management stuff
'wrapped_WindowShouldClose',
'wrapped_free',
'wrapped_alloc'
]
for (const { name, description, returnType, params, original } of wrapped) {
if (blocklist.includes(name)) {
continue
}
// does return need to be converted to a pointer?
const returnPointer = /^[A-Z]/.test(returnType)
// do any params need to be converted to pointers?
let paramPointer = false
const inputParams = params.map((p) => {
if (/^[A-Z]/.test(p.type)) {
paramPointer = true
return `${p.type.trim()} ${p.name}`
} else {
return `${p.type} ${p.name}`
}
})
const callParams = params.map((p) => {
if (/^[A-Z]/.test(p.type)) {
paramPointer = true
return `*${p.name}`
} else {
return p.name
}
})
out.push(`// ${description}`)
if (returnPointer) {
out.push(`${returnType} ${name}(${inputParams.join(', ')}) {`)
out.push(` ${returnType} _ret = wrapped_alloc(sizeof(${returnType.replace('*', '')}));`)
out.push(` *_ret = ${original}(${callParams.join(', ')});`)
out.push(' return _ret;')
} else {
out.push(`${returnType} ${name}(${inputParams.join(', ')}) {`)
if (returnType === 'void') {
out.push(` ${original}(${callParams.join(', ')});`)
} else {
out.push(` return ${original}(${callParams.join(', ')});`)
}
}
out.push('}\n')
}
await writeFile('src/lib.c', out.join('\n'))
- Vorherrschende Sprache
- C
- Sterne
- 0
- Forks
- 1
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus konsumer/raylib-pointers
-
Potential memory leakOffen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
konsumer/raylib-pointers#12 · 2 Kommentare · 1 Reaktion ·
-
Nested structs & arraysOffenenhancement parent
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
-
defines (bun)Offenbunjs enhancement todo
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 48/100
-
nested structs (bun)Offenbunjs enhancement todo
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
-
bunjs enhancement todo
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 45/100
Alle Issues in konsumer/raylib-pointers
Ähnliche Issues
-
enhancement good first issue help wanted
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
-
bug multiplayer status: planned
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 67/100
ChupathingyCE/chupathingyce#851 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 73/100
HigherOrderCO/Bend#2104 ·
-
research-radar
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 1 Tag
-
good first issue help wanted program
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
hffgzktbcc-blip/ounce-core#297 ·
Maintainer antworten meist innerhalb von 1 Tag