Navigation Menu

Skip to content

Commit

Permalink
fpvm: new fpvm_set_bind_callback API
Browse files Browse the repository at this point in the history
  • Loading branch information
Sebastien Bourdeauducq committed Nov 24, 2011
1 parent 81eddbd commit 4c7e4c9
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
6 changes: 6 additions & 0 deletions software/include/fpvm/fpvm.h
Expand Up @@ -49,8 +49,13 @@ struct fpvm_tbinding {
char sym[FPVM_MAXSYMLEN];
};

typedef void (*fpvm_bind_callback)(void *, const char *, int);

struct fpvm_fragment {
char last_error[FPVM_MAXERRLEN];
fpvm_bind_callback bind_callback;
void *bind_callback_user;

/* A binding is a link between the FPVM and the user,
* made by permanently allocating a given register for the user.
* Constants fall in this category because they need to be initialized
Expand Down Expand Up @@ -93,6 +98,7 @@ struct fpvm_fragment {
const char *fpvm_version();

void fpvm_init(struct fpvm_fragment *fragment, int vector_mode);
void fpvm_set_bind_callback(struct fpvm_fragment *fragment, fpvm_bind_callback callback, void *user);

int fpvm_bind(struct fpvm_fragment *fragment, const char *sym);
void fpvm_set_xin(struct fpvm_fragment *fragment, const char *sym);
Expand Down
19 changes: 16 additions & 3 deletions software/libfpvm/fpvm.c
Expand Up @@ -33,6 +33,8 @@ const char *fpvm_version()
void fpvm_init(struct fpvm_fragment *fragment, int vector_mode)
{
fragment->last_error[0] = 0;
fragment->bind_callback = NULL;
fragment->bind_callback_user = NULL;

fragment->nbindings = 3;
fragment->bindings[0].isvar = 1;
Expand Down Expand Up @@ -70,15 +72,26 @@ void fpvm_init(struct fpvm_fragment *fragment, int vector_mode)
fragment->vector_mode = vector_mode;
}

void fpvm_set_bind_callback(struct fpvm_fragment *fragment, fpvm_bind_callback callback, void *user)
{
fragment->bind_callback = callback;
fragment->bind_callback_user = user;
}

int fpvm_bind(struct fpvm_fragment *fragment, const char *sym)
{
int r;

if(fragment->nbindings == FPVM_MAXBINDINGS) {
snprintf(fragment->last_error, FPVM_MAXERRLEN, "Failed to allocate register for variable: %s", sym);
return FPVM_INVALID_REG;
}
fragment->bindings[fragment->nbindings].isvar = 1;
strcpy(fragment->bindings[fragment->nbindings].b.v, sym);
return fragment->nbindings++;
r = fragment->nbindings++;
fragment->bindings[r].isvar = 1;
strcpy(fragment->bindings[r].b.v, sym);
if(fragment->bind_callback != NULL)
fragment->bind_callback(fragment->bind_callback_user, sym, r);
return r;
}

void fpvm_set_xin(struct fpvm_fragment *fragment, const char *sym)
Expand Down

0 comments on commit 4c7e4c9

Please sign in to comment.