]> mj.ucw.cz Git - pciutils.git/blob - lib/params.c
979fb16dcaa53b41dcf29ca1f22a173cf249c4be
[pciutils.git] / lib / params.c
1 /*
2  *      The PCI Library -- Parameters
3  *
4  *      Copyright (c) 2008--2023 Martin Mares <mj@ucw.cz>
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 }