CS 330 Lecture 19 – Abstracting a GUI
Agenda
- the libexpat API
- slurping a file in C
- adding a GUI abstraction layer using XML
TODO
- Why we chunk-read: http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/
- C file I/O: http://en.wikibooks.org/wiki/A_Little_C_Primer/C_File-IO_Through_Library_Functions
Code
parse_xml.c
#include <expat.h> #include <stdio.h> #include <stdlib.h> /* typedef parser_t * XML_Parser; */ /* ------------------------------------------------------------------------- */ void start(void *data, const char *tag, const char **attributes) { printf("data: %d\n", *((int *) data)); printf("tag: %s\n", tag); } /* ------------------------------------------------------------------------- */ void end(void *data, const char *tag) { printf("tag: %s\n", tag); } /* ------------------------------------------------------------------------- */ int main(int argc, char **argv) { int foo = 17; XML_Parser parser = XML_ParserCreate(NULL); XML_SetElementHandler(parser, start, end); XML_SetUserData(parser, &foo); FILE *xml_file = fopen(argv[1], "r"); int done = 0; const int BUFFER_SIZE = 8192; char buffer[BUFFER_SIZE]; while (!done) { int length = fread(buffer, sizeof(char), BUFFER_SIZE, xml_file); done = feof(xml_file); XML_Parse(parser, buffer, length, done); } fclose(xml_file); XML_ParserFree(parser); return 0; }
emailclient.xml
<?xml version="1.0" encoding="UTF-8"?> <panel orientation="vertical"> <panel orientation="horizontal"> <label text="To:" /> <textbox name="toBox" /> </panel> <panel orientation="horizontal"> <label text="Subject:" /> <textbox name="subjectBox" /> </panel> <textarea name="bodyBox" /> <button text="Send" /> </panel>
swingify.c
#include <expat.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int coreyNeedsToThinkOfAName = -1; /* ------------------------------------------------------------------------- */ void start(void *data, const char *tag, const char **attributes) { /* printf("open %s\n", tag); */ /* for (int i = 0; attributes[i] != NULL; i += 2) { */ /* printf("%s -> %s\n", attributes[i], attributes[i + 1]); */ /* } */ if (strcmp(tag, "panel") == 0) { ++coreyNeedsToThinkOfAName; printf("JPanel panel%d = new JPanel();\n", coreyNeedsToThinkOfAName); printf("panel%d.setLayout(new BoxLayout(panel%d, BoxLayout.%s));\n", coreyNeedsToThinkOfAName, coreyNeedsToThinkOfAName, strcmp(attributes[1], "vertical") == 0 ? "PAGE_AXIS" : "LINE_AXIS"); } else if (strcmp(tag, "label") == 0) { printf("panel%d.add(new JLabel(\"%s\"));\n", coreyNeedsToThinkOfAName, attributes[1]); } else if (strcmp(tag, "textbox") == 0) { printf("panel%d.add(new JTextField());\n", coreyNeedsToThinkOfAName); } } /* ------------------------------------------------------------------------- */ void end(void *data, const char *tag) { /* printf("close %s\n", tag); */ } /* ------------------------------------------------------------------------- */ int main(int argc, char **argv) { XML_Parser parser = XML_ParserCreate(NULL); XML_SetElementHandler(parser, start, end); FILE *xml_file = fopen(argv[1], "r"); int done = 0; const int BUFFER_SIZE = 8192; char buffer[BUFFER_SIZE]; while (!done) { int length = fread(buffer, sizeof(char), BUFFER_SIZE, xml_file); done = feof(xml_file); XML_Parse(parser, buffer, length, done); } fclose(xml_file); XML_ParserFree(parser); return 0; }
Haiku
Gramps says life was tough.
Read and write XML much?
That’s uphill both ways.
Read and write XML much?
That’s uphill both ways.