elf_errorstatus elf_xen_parse_features(const char *features, uint32_t *supported, uint32_t *required) { unsigned char feature[64]; unsigned pos, len, i; if ( features == NULL ) return 0; for ( pos = 0; features[pos] != '\0'; pos += len ) { elf_memset_unchecked(feature, 0, sizeof(feature)); for ( len = 0;; len++ ) { if ( len >= sizeof(feature)-1 ) break; if ( features[pos + len] == '\0' ) break; if ( features[pos + len] == '|' ) { len++; break; } feature[len] = features[pos + len]; } for ( i = 0; i < elf_xen_features; i++ ) { if ( !elf_xen_feature_names[i] ) continue; if ( feature[0] == '!' ) { /* required */ if ( !strcmp(feature + 1, elf_xen_feature_names[i]) ) { elf_xen_feature_set(i, supported); if ( required ) elf_xen_feature_set(i, required); break; } } else { /* supported */ if ( !strcmp(feature, elf_xen_feature_names[i]) ) { elf_xen_feature_set(i, supported); break; } } } if ( i == elf_xen_features && required && feature[0] == '!' ) return -1; } return 0; }
int elf_xen_parse_features(const char *features, uint32_t *supported, uint32_t *required) { char feature[64]; int pos, len, i; if ( features == NULL ) return 0; for ( pos = 0; features[pos] != '\0'; pos += len ) { memset(feature, 0, sizeof(feature)); for ( len = 0;; len++ ) { if ( len >= sizeof(feature)-1 ) break; if ( features[pos + len] == '\0' ) break; if ( features[pos + len] == '|' ) { len++; break; } feature[len] = features[pos + len]; } for ( i = 0; i < elf_xen_features; i++ ) { if ( !elf_xen_feature_names[i] ) continue; if ( (required != NULL) && (feature[0] == '!') ) { /* required */ if ( !strcmp(feature + 1, elf_xen_feature_names[i]) ) { elf_xen_feature_set(i, supported); elf_xen_feature_set(i, required); break; } } else { /* supported */ if ( !strcmp(feature, elf_xen_feature_names[i]) ) { elf_xen_feature_set(i, supported); break; } } } if ( i == elf_xen_features ) return -1; } return 0; }