Use vectors
This commit is contained in:
parent
d7acfd8c8e
commit
a797d269c5
72
cyoa.leg
72
cyoa.leg
@ -7,14 +7,9 @@
|
|||||||
|
|
||||||
typedef struct page_t page_t;
|
typedef struct page_t page_t;
|
||||||
typedef struct footer_t footer_t;
|
typedef struct footer_t footer_t;
|
||||||
|
typedef struct statcheck_t statcheck_t;
|
||||||
typedef struct page_node_t page_node_t;
|
typedef struct statchange_t statchange_t;
|
||||||
typedef struct choicelist choicelist;
|
typedef struct choice_t choice_t;
|
||||||
|
|
||||||
struct page_node_t {
|
|
||||||
page_t *page;
|
|
||||||
page_node_t *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define FOOTER_END 1
|
#define FOOTER_END 1
|
||||||
#define FOOTER_GOTO 2
|
#define FOOTER_GOTO 2
|
||||||
@ -22,7 +17,7 @@ struct page_node_t {
|
|||||||
struct footer_t {
|
struct footer_t {
|
||||||
int type;
|
int type;
|
||||||
union {
|
union {
|
||||||
choicelist *choices;
|
std::vector<choice_t*> choices;
|
||||||
char *link;
|
char *link;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -33,10 +28,6 @@ struct page_t {
|
|||||||
footer_t footer;
|
footer_t footer;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct statcheck_t statcheck_t;
|
|
||||||
typedef struct statchange_t statchange_t;
|
|
||||||
typedef struct choice_t choice_t;
|
|
||||||
|
|
||||||
#define STATCHECK_GT 1
|
#define STATCHECK_GT 1
|
||||||
#define STATCHECK_LT 2
|
#define STATCHECK_LT 2
|
||||||
|
|
||||||
@ -64,18 +55,10 @@ struct choice_t {
|
|||||||
statchange_t statchange;
|
statchange_t statchange;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct choicelist {
|
std::vector<page_t*> pages;
|
||||||
choice_t *choice;
|
|
||||||
choicelist *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
page_node_t *pages;
|
|
||||||
|
|
||||||
choice_t *make_choice();
|
choice_t *make_choice();
|
||||||
|
|
||||||
void add_page(page_t*);
|
|
||||||
void add_choice(choicelist*, choice_t*);
|
|
||||||
|
|
||||||
page_t *emit_ending();
|
page_t *emit_ending();
|
||||||
page_t *emit_goto(char*);
|
page_t *emit_goto(char*);
|
||||||
page_t *emit_choices();
|
page_t *emit_choices();
|
||||||
@ -86,7 +69,7 @@ union value {
|
|||||||
page_t *page;
|
page_t *page;
|
||||||
char *string;
|
char *string;
|
||||||
choice_t *choice;
|
choice_t *choice;
|
||||||
choicelist *choices;
|
std::vector<choice_t*> *choices;
|
||||||
int num;
|
int num;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -95,7 +78,7 @@ union value {
|
|||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
Story = BlankLine* (p:Page { add_page(p.page); })+ EndOfFile;
|
Story = BlankLine* (p:Page { pages.push_back(p.page); })+ EndOfFile;
|
||||||
|
|
||||||
Page = h:Header b:Body { $$.page = b.page; $$.page->id = h.string}
|
Page = h:Header b:Body { $$.page = b.page; $$.page->id = h.string}
|
||||||
BlankLine*;
|
BlankLine*;
|
||||||
@ -120,8 +103,8 @@ Goto = 'GOTO' Spacing < i:Identifier > Newline
|
|||||||
|
|
||||||
Ending = 'THE END' Newline;
|
Ending = 'THE END' Newline;
|
||||||
|
|
||||||
ChoiceList = c:Choice l:ChoiceList { $$ = l; add_choice($$.choices, c.choice); }
|
ChoiceList = c:Choice l:ChoiceList { $$ = l; $$.choices->push_back(c.choice); }
|
||||||
| c:Choice { $$.choices = NULL; add_choice($$.choices, c.choice); }
|
| c:Choice { $$.choices = new std::vector<choice_t*>(); $$.choices->push_back(c.choice); }
|
||||||
|
|
||||||
Choice = b:Bullet f:Freetext r:Redirect
|
Choice = b:Bullet f:Freetext r:Redirect
|
||||||
{
|
{
|
||||||
@ -152,38 +135,6 @@ Newline = '\r\n' | '\r' | '\n';
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
void add_page(page_t *page) {
|
|
||||||
page_node_t *mynode = (page_node_t*) malloc(sizeof(page_node_t));
|
|
||||||
mynode->page = page;
|
|
||||||
mynode->next = NULL;
|
|
||||||
|
|
||||||
page_node_t *curr = pages;
|
|
||||||
page_node_t *prev = NULL;
|
|
||||||
|
|
||||||
if (curr) {
|
|
||||||
for(; curr; prev = curr, curr = curr->next);
|
|
||||||
prev->next = mynode;
|
|
||||||
} else {
|
|
||||||
pages = mynode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_choice(choicelist *choices, choice_t* choice) {
|
|
||||||
choicelist *mychoices = (choicelist *) malloc(sizeof(choicelist));
|
|
||||||
mychoices->choice = choice;
|
|
||||||
mychoices->next = NULL;
|
|
||||||
|
|
||||||
choicelist *curr = choices;
|
|
||||||
choicelist *prev = NULL;
|
|
||||||
|
|
||||||
if (curr) {
|
|
||||||
for(; curr; prev = curr, curr = curr->next);
|
|
||||||
prev->next = mychoices;
|
|
||||||
} else {
|
|
||||||
choices = mychoices;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline page_t *make_page() {
|
static inline page_t *make_page() {
|
||||||
page_t *mypage = (page_t*) malloc(sizeof(page_t));
|
page_t *mypage = (page_t*) malloc(sizeof(page_t));
|
||||||
mypage->id = NULL;
|
mypage->id = NULL;
|
||||||
@ -214,7 +165,6 @@ page_t *emit_ending() {
|
|||||||
page_t *emit_choices() {
|
page_t *emit_choices() {
|
||||||
page_t *mypage = make_page();
|
page_t *mypage = make_page();
|
||||||
mypage->footer.type = FOOTER_CHOICES;
|
mypage->footer.type = FOOTER_CHOICES;
|
||||||
mypage->footer.choices = NULL;
|
|
||||||
printf("page 0x%x\n", mypage);
|
printf("page 0x%x\n", mypage);
|
||||||
return mypage;
|
return mypage;
|
||||||
}
|
}
|
||||||
@ -252,8 +202,8 @@ int main() {
|
|||||||
printf("Parsing Error!\n");
|
printf("Parsing Error!\n");
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
for (page_node_t *curr = pages; curr; curr = curr->next) {
|
for (page_t* page: pages) {
|
||||||
print_page(curr->page);
|
print_page(page);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user