+ #endif
+
+
+ // TODO: Multiple modules?
+ tUDI_DriverModule *driver_module = NEW(tUDI_DriverModule,);
+ driver_module->InitInfo = info;
+
+ // - Parse udiprops
+ {
+ char **udipropsptrs;
+
+ Log_Debug("UDI", "udiprops = %p, udiprops_end = %p", udiprops, udiprops_end);
+ size_t udiprops_size = udiprops_end - udiprops;
+
+ int nLines = 1;
+ for( int i = 0; i < udiprops_size; i++ )
+ {
+ if( udiprops[i] == '\0' )
+ nLines ++;
+ }
+
+ Log_Debug("UDI", "nLines = %i", nLines);
+
+ udipropsptrs = NEW(char*,*nLines);
+ int line = 0;
+ udipropsptrs[line++] = udiprops;
+ for( int i = 0; i < udiprops_size; i++ )
+ {
+ if( udiprops[i] == '\0' ) {
+ udipropsptrs[line++] = &udiprops[i+1];
+ }
+ }
+ if(udipropsptrs[line-1] == &udiprops[udiprops_size])
+ nLines --;
+
+ for( int i = 0; i < nLines; i ++ )
+ {
+ }
+
+ // Parse out:
+ // 'message' into driver_module->Messages
+ // 'region' into driver_module->RegionTypes
+ // 'module' into driver_module->ModuleName
+
+ int nMessages = 0;
+ int nLocales = 1;
+ int nRegionTypes = 0;
+ for( int i = 0; i < nLines; i ++ )
+ {
+ const char *str = udipropsptrs[i];
+ if( strncmp("module ", str, 7) == 0 ) {
+ driver_module->ModuleName = str + 7;
+ }
+ else if( strncmp("message ", str, 8) == 0 ) {
+ nMessages ++;
+ }
+ else if( strncmp("locale ", str, 7) == 0 ) {
+ nLocales ++;
+ }
+ else if( strncmp("region ", str, 7) == 0 ) {
+ nRegionTypes ++;
+ }
+ }
+
+ // Allocate structures
+ driver_module->nMessages = nMessages;
+ driver_module->Messages = NEW(tUDI_PropMessage, *nMessages);
+ driver_module->nRegionTypes = nRegionTypes;
+ driver_module->RegionTypes = NEW(tUDI_PropRegion, *nRegionTypes);
+
+ // Populate
+ int cur_locale = 0;
+ int msg_index = 0;
+ for( int i = 0; i < nLines; i ++ )
+ {
+ const char *str = udipropsptrs[i];
+ if( strncmp("module ", str, 7) == 0 ) {
+ driver_module->ModuleName = str + 7;
+ }
+ else if( strncmp("message ", str, 8) == 0 ) {
+ tUDI_PropMessage *msg = &driver_module->Messages[msg_index++];
+ char *end;
+ msg->locale = cur_locale;
+ msg->index = strtoul(str+8, &end, 10);
+ if( *end != ' ' && *end != '\t' ) {
+ // Oops.
+ continue ;
+ }
+ while( isspace(*end) )
+ end ++;
+ msg->string = end;
+
+ Log_Debug("UDI", "Message %i/%i: '%s'", msg->locale, msg->index, msg->string);
+ }
+ else if( strncmp("locale ", str, 7) == 0 ) {
+ // TODO: Set locale
+ cur_locale = 1;
+ }
+ else if( strncmp("region ", str, 7) == 0 ) {
+ nRegionTypes ++;
+ }
+ else {
+ Log_Debug("UDI", "udipropsptrs[%i] = '%s'", i, udipropsptrs[i]);
+ }
+ }
+
+ // Sort message list
+ // TODO: Sort message list
+ }
+
+ int nSecondaryRgns = 0;
+ for( int i = 0; info->secondary_init_list && info->secondary_init_list[i].region_idx; i ++ )
+ nSecondaryRgns ++;
+ driver_module->nSecondaryRegions = nSecondaryRgns;
+
+ // Create initial driver instance
+ tUDI_DriverInstance *inst = UDI_CreateInstance(driver_module);
+
+ for( int i = 0; i < 1+driver_module->nSecondaryRegions; i ++ )
+ Log("Rgn %i: %p", i, inst->Regions[i]);
+
+ // Send usage indication
+ udi_usage_cb_t ucb;
+ memset(&ucb, 0, sizeof(ucb));
+ ucb.gcb.channel = inst->ManagementChannel;
+ udi_usage_ind(&ucb, UDI_RESOURCES_NORMAL);