1 /* 2 * The PCI Library -- Parameters 3 * 4 * Copyright (c) 2008--2023 Martin Mares <[email protected]> 5 * 6 * Can be freely distributed and used under the terms of the GNU GPL. 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 13 #include "internal.h" 14 15 char * 16 pci_get_param(struct pci_access *acc, char *param) 17 { 18 struct pci_param *p; 19 20 for (p=acc->params; p; p=p->next) 21 if (!strcmp(p->param, param)) 22 return p->value; 23 return NULL; 24 } 25 26 void 27 pci_define_param(struct pci_access *acc, char *param, char *value, char *help) 28 { 29 struct pci_param *p, **pp; 30 31 for (pp=&acc->params; p = *pp; pp=&p->next) 32 { 33 int cmp = strcmp(p->param, param); 34 if (!cmp) 35 { 36 if (strcmp(p->value, value) || strcmp(p->help, help)) 37 acc->error("Parameter %s re-defined differently", param); 38 return; 39 } 40 if (cmp > 0) 41 break; 42 } 43 44 p = pci_malloc(acc, sizeof(*p)); 45 p->next = *pp; 46 *pp = p; 47 p->param = param; 48 p->value = value; 49 p->value_malloced = 0; 50 p->help = help; 51 } 52 53 int 54 pci_set_param_internal(struct pci_access *acc, char *param, char *value, int copy) 55 { 56 struct pci_param *p; 57 58 for (p=acc->params; p; p=p->next) 59 if (!strcmp(p->param, param)) 60 { 61 if (p->value_malloced) 62 pci_mfree(p->value); 63 p->value_malloced = copy; 64 if (copy) 65 p->value = pci_strdup(acc, value); 66 else 67 p->value = value; 68 return 0; 69 } 70 return -1; 71 } 72 73 int 74 pci_set_param(struct pci_access *acc, char *param, char *value) 75 { 76 return pci_set_param_internal(acc, param, value, 1); 77 } 78 79 void 80 pci_free_params(struct pci_access *acc) 81 { 82 struct pci_param *p; 83 84 while (p = acc->params) 85 { 86 acc->params = p->next; 87 if (p->value_malloced) 88 pci_mfree(p->value); 89 pci_mfree(p); 90 } 91 } 92 93 struct pci_param * 94 pci_walk_params(struct pci_access *acc, struct pci_param *prev) 95 { 96 /* So far, the params form a simple linked list, but this can change in the future */ 97 if (!prev) 98 return acc->params; 99 else 100 return prev->next; 101 } 102