nested-structs/arrays (C)
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 28/100
- Type d'issue
- Fonctionnalité
- Clarté
- À clarifier
- Activité
- À l'abandon
- Stack technique
- c, javascript
- Domaine
- tooling
Piste de recherche
Commencez par tools/gen_lib.js, autour de la boucle de génération des structs, et examinez les champs de structs de api.json, en particulier les types de tableaux et de structs imbriqués actuellement ignorés. Vérifiez d'abord l'issue #9, puis inspectez les src/structs.h et src/lib.c générés ; la tâche est terminée lorsque ces champs ne sont plus omis silencieusement des utilitaires générés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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'))
- Langage dominant
- C
- Étoiles
- 0
- Forks
- 1
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de konsumer/raylib-pointers
-
Potential memory leakOuverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
konsumer/raylib-pointers#12 · 2 commentaires · 1 réaction ·
-
Nested structs & arraysOuverteenhancement parent
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
-
defines (bun)Ouvertebunjs enhancement todo
Difficulté 2/5 1-3 heures Accessibilité débutants 48/100
-
nested structs (bun)Ouvertebunjs enhancement todo
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
-
bunjs enhancement todo
Difficulté 3/5 1-2 jours Accessibilité débutants 45/100
Toutes les issues de konsumer/raylib-pointers
Issues similaires
-
Implement looks_size reporterOuverteenhancement good first issue help wanted
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
-
bug multiplayer status: planned
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
ChupathingyCE/chupathingyce#851 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 73/100
HigherOrderCO/Bend#2104 ·
-
Research radar digest 2026-W46Ouverteresearch-radar
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
good first issue help wanted program
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
hffgzktbcc-blip/ounce-core#297 ·
Les mainteneurs répondent en général sous 1 jour