RPA Toolkit
Modified documentation and exaples. Removed RPA_RECORD_INVALID_UID.
[rpatk.git] / rpa / doc / example / personname.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "rpa/rpa.h"
4
5 /*
6  * This example shows the sequence of RPA APIs to parse an input. No error checking is done,
7  * to keep the example simple and make the API call sequence easy to follow.
8  *
9  * To compile and run this sample on Linux:
10  * 1. Install Rpa/Tk:
11  * # cd rpatk/build/linux/x86_64
12  * # make
13  * # make install (as superuser)
14  *
15  * 2. Build this example:
16  * # gcc -o personname personname.c -I/usr/include/rpatk -lrpa -lrvm -lrlib -lm
17  *
18  * 3. Run it, and you should get:
19  * # ./personname
20  * RPA_RECORD_START   (ID: 1)  name: John M. Smith
21  * RPA_RECORD_START   (ID: 2)  first: John
22  * RPA_RECORD_END     (ID: 2)  first: John
23  * RPA_RECORD_START   (ID: 0)  middle: M.
24  * RPA_RECORD_END     (ID: 0)  middle: M.
25  * RPA_RECORD_START   (ID: 3)  last: Smith
26  * RPA_RECORD_END     (ID: 3)  last: Smith
27  * RPA_RECORD_END     (ID: 1)  name: John M. Smith
28  */
29 int main(int argc, char *argv[])
30 {
31         rlong i;
32         rpadbex_t *dbex;
33         rpastat_t *stat;
34         rparecord_t *record;
35         rarray_t *records = rpa_records_create();
36
37         char name[] = "John M. Smith";
38         char bnf[] = 
39                 "#!emitid name 1\n"
40                 "#!emitid first 2\n"
41                 "#!emitid last 3\n"
42                 "\n"
43                 "first  ::= [A-Za-z]+\n"
44                 "middle ::= [A-Za-z]+ '.'?\n"
45                 "last   ::= [A-Za-z]+\n"
46                 "name   ::= <first> ' ' <middle> ' ' <last>\n";
47
48         dbex = rpa_dbex_create();
49         rpa_dbex_open(dbex);
50         rpa_dbex_load(dbex, bnf, strlen(bnf));
51         rpa_dbex_close(dbex);
52         rpa_dbex_compile(dbex);
53         stat = rpa_stat_create(dbex, RPA_DEFAULT_STACKSIZE);
54         rpa_stat_parse(stat, rpa_dbex_last(dbex), RPA_ENCODING_UTF8, name, name, name+sizeof(name), records);
55         for (i = 0; i < rpa_records_length(records); i++) {
56                 record = rpa_records_slot(records, i);
57                 if (record->type == RPA_RECORD_START)
58                         fprintf(stdout, "RPA_RECORD_START   (UID: %d)  ", record->ruleuid);
59                 if (record->type == RPA_RECORD_END)
60                         fprintf(stdout, "RPA_RECORD_END     (UID: %d)  ", record->ruleuid);
61                 /*
62                  * record->rule points to memory allocated by rpadbex_t,
63                  * make sure rpadbex_t object is not destroyed while accessing this pointer.
64                  */
65                 fprintf(stdout, "%s: ", record->rule);
66                 fwrite(record->input, 1, record->inputsiz, stdout);
67                 fprintf(stdout, "\n");
68         }
69         rpa_records_destroy(records);
70         rpa_stat_destroy(stat);
71         rpa_dbex_destroy(dbex);
72         return 0;
73 }