source: libcfa/src/parseconfig.cfa@ 4cc6c7d

ADT ast-experimental enum forall-pointer-decay jacob/cs343-translation pthread-emulation qualifiedEnum stuck-waitfor-destruct
Last change on this file since 4cc6c7d was 8f01cb04, checked in by Jacob Prud'homme <jafprudhomme@…>, 4 years ago

Switched to importing default parsing functions from parseargs

  • Property mode set to 100644
File size: 2.4 KB
RevLine 
[1896c1f]1#include <fstream.hfa>
[8f01cb04]2#include <parseargs.hfa>
[16f9aca]3#include "parseconfig.hfa"
4
[5e0e488]5struct KVPairs {
6 int size, max_size;
7 * [ char *, char * ] data;
8};
[58ebd786]9void ?{}( KVPairs & kvp ) with ( kvp ) { // default constructor
[5e0e488]10 size = 0; max_size = 0; data = 0p;
11}
[58ebd786]12void ?{}( KVPairs & kvp, int size ) { // initialization
13 kvp.[ size, max_size ] = [ 0, size ];
14 kvp.data = alloc( size );
[5e0e488]15}
[58ebd786]16void ^?{}( KVPairs & kvp ) with ( kvp ) { // destructor
[5e0e488]17 free( data );
18 size = 0; max_size = 0; data = 0p;
19}
20
[58ebd786]21void add_kv_pair( KVPairs kv_pairs, char * k, char * v ) with ( kv_pairs ) {
[5e0e488]22 if ( size == max_size ) {
[58ebd786]23 max_size *= 2;
[5e0e488]24 data = resize( data, max_size );
25 }
26
27 data[size] = [ k, v ];
28 ++size;
29}
30
[2c2d32b]31bool comments( ifstream & in, char * name ) {
[181ef73]32 while () {
[1896c1f]33 in | name;
34 if ( fail( in ) ) return true;
[2c2d32b]35 if ( name[0] != '#' ) break;
[1896c1f]36 in | nl; // ignore remainder of line
[16f9aca]37 } // for
38 return false;
39} // comments
40
[33800ac8]41// Parse configuration from a file formatted in shell style
[58ebd786]42KVPairs & parse_shell_config_format( const char * config_file, size_t num_entries ) {
43 KVPairs kv_pairs = { num_entries };
[5e0e488]44
[4df8fef5]45 ifstream in;
[c2016b6]46 try {
[4df8fef5]47 open( in, config_file ); // open the configuration file for input
[16f9aca]48
[ff3be413]49 while () {
[4df8fef5]50 char * key;
51 char * value;
52 if ( comments( in, key ) ) break; // eof ?
[ff3be413]53 // Should we just overwrite duplicate config entries? Having a hash map would make this much easier
[1896c1f]54 in | value;
[d5cfc7e]55
56 add_kv_pair( kv_pairs, key, value );
57
[1896c1f]58 if ( fail( in ) ) break;
59 in | nl; // ignore remainder of line
[16f9aca]60 } // for
[1896c1f]61 } catch( Open_Failure * ex; ex->istream == &in ) {
[4df8fef5]62 exit | "Error: could not open input file \"" | config_file | "\"";
[16f9aca]63 } // try
[ff3be413]64 close( in );
[e7e5b81]65
[33800ac8]66 return kv_pairs;
67}
68
[58ebd786]69// Parse configuration values from intermediate format
[33800ac8]70void parse_config( const char * config_file, config_entry entries[], size_t num_entries ) {
[58ebd786]71 KVPairs kv_pairs = parse_shell_config_format( config_file, num_entries );
[33800ac8]72
[e7e5b81]73 int entries_so_far = 0;
74 for ( i; kv_pairs.size ) {
75 if ( entries_so_far == num_entries ) break;
76
77 char * src_key, * src_value;
78 [ src_key, src_value ] = kv_pairs.data[i];
79
80 for ( j; num_entries ) {
81 if ( strcmp( src_key, entries[j].key ) != 0 ) continue;
82 if ( entries[j].parse( src_value, entries[j].variable ) ) {
83 ++entries_so_far;
84 break;
85 }
86
[58ebd786]87 serr | "Value '" | src_value | "' for key '" | src_key | "' could not be parsed";
[e7e5b81]88 }
89 }
[16f9aca]90} // processConfigFile
91
[e7e5b81]92
[16f9aca]93// Local Variables: //
94// tab-width: 4 //
95// compile-command: "cfa parseconfig.cfa" //
96// End: //
Note: See TracBrowser for help on using the repository browser.