From: <js...@us...> - 2004-09-19 22:36:08
|
Update of /cvsroot/exult/exult/files In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25270/files Modified Files: msgfile.cc msgfile.h Log Message: Text: one file with several sections supported Index: msgfile.cc =================================================================== RCS file: /cvsroot/exult/exult/files/msgfile.cc,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- msgfile.cc 19 Sep 2004 07:18:16 -0000 1.4 +++ msgfile.cc 19 Sep 2004 22:35:57 -0000 1.5 @@ -24,11 +24,15 @@ #include <iostream> #include <vector> +#include <ctype.h> +#include <iomanip> #include "utils.h" using std::istream; +using std::ostream; using std::cerr; using std::endl; +using std::hex; using std::vector; /* @@ -39,6 +43,10 @@ * or decimal. * Max. text length is 1024. * A line beginning with a '#' is a comment. + * A 'section' can be marked: + * %%section shapes + * .... + * %%endsection * Output: # of first message (i.e., lowest-numbered msg), or -1 if * error. */ @@ -46,8 +54,10 @@ int Read_text_msg_file ( istream& in, - vector<char *>& strings // Strings returned here, each + vector<char *>& strings, // Strings returned here, each // allocated on heap. + char *section // Section name, or NULL. If given + // the section must be next infile. ) { strings.resize(0); // Initialize. @@ -70,6 +80,24 @@ if (!buf[0]) continue; // Empty line. char *ptr = &buf[0]; + if (section) + { + if (buf[0] != '%' || + strncmp(ptr + 1, "%section", 8) != 0) + continue; + for (ptr = &buf[9]; isspace(*ptr); ++ptr) + ; + if (strncmp(ptr, section, strlen(ptr)) == 0) + { // Found the section. + section = 0; + continue; + } + cerr << "Line #" << linenum << + " has the wrong section name" << endl; + return -1; + } + if (buf[0] == '%' && strncmp(ptr + 1, "%endsection", 11) == 0) + break; char *endptr; // Get line# in decimal, hex, or oct. long index = strtol(ptr, &endptr, 0); if (endptr == ptr) // No #? @@ -104,14 +132,34 @@ istream& in, char **& strings, // Strings returned here, each // allocated on heap. - int& count + int& count, + char *section ) { vector<char *> txtlist; - int first = Read_text_msg_file(in, txtlist); + int first = Read_text_msg_file(in, txtlist, section); count = txtlist.size(); strings = new char *[count]; for (int i = 0; i < count; ++i) strings[i] = txtlist[i]; return first; } + +/* + * Write one section. + */ + +void Write_msg_file_section + ( + ostream& out, + char *section, + char **items, + int num_items + ) + { + out << "%%section " << section << endl; + for (int i = 0; i < num_items; ++i) + out << hex << "0x" << i << ':' << items[i] << endl; + out << "%%endsection " << section << endl; + } + Index: msgfile.h =================================================================== RCS file: /cvsroot/exult/exult/files/msgfile.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- msgfile.h 19 Sep 2004 07:18:16 -0000 1.2 +++ msgfile.h 19 Sep 2004 22:35:57 -0000 1.3 @@ -8,19 +8,30 @@ #define INCL_MSGFILE_H 1 using std::istream; +using std::ostream; using std::vector; int Read_text_msg_file ( istream& in, - vector<char *>& strings // Strings returned here, each + vector<char *>& strings, // Strings returned here, each // allocated on heap. + char *section = 0 ); int Read_text_msg_file ( istream& in, char **& strings, // Strings returned here, each // allocated on heap. - int& count + int& count, + char *section = 0 ); +void Write_msg_file_section + ( + ostream& out, + char *section, + char **items, + int num_items + ); + #endif |