+ size = strtoul (p, &p, 10);
+ if (!nacl_length_set) {
+ desc->spec [MONO_INST_LEN] = size;
+ }
+ } else if (strncmp (p, "nacl:", 5) == 0) {
+ unsigned long size;
+ p += 5;
+ size = strtoul (p, &p, 10);
+ if (nacl) {
+ desc->spec [MONO_INST_LEN] = size;
+ nacl_length_set = TRUE;
+ }
+ } else if (strncmp (p, "template:", 9) == 0) {
+ char *tname;
+ int i;
+ OpDesc *tdesc;
+ p += 9;
+ tname = p;
+ while (*p && isalnum (*p)) ++p;
+ *p++ = 0;
+ tdesc = g_hash_table_lookup (template_table, tname);
+ if (!tdesc)
+ g_error ("Invalid template name %s at '%s' at line %d in %s\n", tname, p, line, name);
+ for (i = 0; i < MONO_INST_MAX; ++i) {
+ if (desc->spec [i])
+ g_error ("The template overrides any previous value set at line %d in %s\n", line, name);
+ }
+ memcpy (desc->spec, tdesc->spec, sizeof (desc->spec));
+ } else if (strncmp (p, "name:", 5) == 0) {
+ char *tname;
+ if (!is_template)
+ g_error ("name tag only valid in templates at '%s' at line %d in %s\n", p, line, name);
+ if (desc->name)
+ g_error ("Duplicated name tag in template %s at '%s' at line %d in %s\n", desc->name, p, line, name);
+ p += 5;
+ tname = p;
+ while (*p && isalnum (*p)) ++p;
+ *p++ = 0;
+ if (g_hash_table_lookup (template_table, tname))
+ g_error ("Duplicated template %s at line %d in %s\n", tname, line, name);
+ desc->name = g_strdup (tname);
+ g_hash_table_insert (template_table, (void*)desc->name, desc);