703ee490461319434ebddba318702c85a9c48e60
[carl9170fw.git] / config / util.c
1 /*
2  * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
3  * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
4  *
5  * Released under the terms of the GNU GPL v2.0.
6  */
7
8 #include <stdarg.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "lkc.h"
12
13 /* file already present in list? If not add it */
14 struct file *file_lookup(const char *name)
15 {
16         struct file *file;
17         char *file_name = sym_expand_string_value(name);
18
19         for (file = file_list; file; file = file->next) {
20                 if (!strcmp(name, file->name)) {
21                         free(file_name);
22                         return file;
23                 }
24         }
25
26         file = xmalloc(sizeof(*file));
27         memset(file, 0, sizeof(*file));
28         file->name = file_name;
29         file->next = file_list;
30         file_list = file;
31         return file;
32 }
33
34 /* write a dependency file as used by kbuild to track dependencies */
35 int file_write_dep(const char *name)
36 {
37         struct file *file;
38         FILE *out;
39
40         if (!name)
41                 name = ".kconfig.d";
42         out = fopen("..config.tmp", "w");
43         if (!out)
44                 return 1;
45         fprintf(out, "deps_config := \\\n");
46         for (file = file_list; file; file = file->next) {
47                 if (file->next)
48                         fprintf(out, "\t%s \\\n", file->name);
49                 else
50                         fprintf(out, "\t%s\n", file->name);
51         }
52         fprintf(out, "\n%s: \\\n"
53                      "\t$(deps_config)\n\n", conf_get_autoconfig_name());
54
55         env_write_dep(out, conf_get_autoconfig_name());
56
57         fprintf(out, "\n$(deps_config): ;\n");
58         fclose(out);
59         rename("..config.tmp", name);
60         return 0;
61 }
62
63
64 /* Allocate initial growable string */
65 struct gstr str_new(void)
66 {
67         struct gstr gs;
68         gs.s = xmalloc(sizeof(char) * 64);
69         gs.len = 64;
70         gs.max_width = 0;
71         strcpy(gs.s, "\0");
72         return gs;
73 }
74
75 /* Free storage for growable string */
76 void str_free(struct gstr *gs)
77 {
78         if (gs->s)
79                 free(gs->s);
80         gs->s = NULL;
81         gs->len = 0;
82 }
83
84 /* Append to growable string */
85 void str_append(struct gstr *gs, const char *s)
86 {
87         size_t l;
88         if (s) {
89                 l = strlen(gs->s) + strlen(s) + 1;
90                 if (l > gs->len) {
91                         gs->s = xrealloc(gs->s, l);
92                         gs->len = l;
93                 }
94                 strcat(gs->s, s);
95         }
96 }
97
98 /* Append printf formatted string to growable string */
99 void str_printf(struct gstr *gs, const char *fmt, ...)
100 {
101         va_list ap;
102         char s[10000]; /* big enough... */
103         va_start(ap, fmt);
104         vsnprintf(s, sizeof(s), fmt, ap);
105         str_append(gs, s);
106         va_end(ap);
107 }
108
109 /* Retrieve value of growable string */
110 const char *str_get(struct gstr *gs)
111 {
112         return gs->s;
113 }
114
115 void *xmalloc(size_t size)
116 {
117         void *p = malloc(size);
118         if (p)
119                 return p;
120         fprintf(stderr, "Out of memory.\n");
121         exit(1);
122 }
123
124 void *xcalloc(size_t nmemb, size_t size)
125 {
126         void *p = calloc(nmemb, size);
127         if (p)
128                 return p;
129         fprintf(stderr, "Out of memory.\n");
130         exit(1);
131 }
132
133 void *xrealloc(void *p, size_t size)
134 {
135         p = realloc(p, size);
136         if (p)
137                 return p;
138         fprintf(stderr, "Out of memory.\n");
139         exit(1);
140 }
141
142 char *xstrdup(const char *s)
143 {
144         char *p;
145
146         p = strdup(s);
147         if (p)
148                 return p;
149         fprintf(stderr, "Out of memory.\n");
150         exit(1);
151 }
152
153 char *xstrndup(const char *s, size_t n)
154 {
155         char *p;
156
157         p = strndup(s, n);
158         if (p)
159                 return p;
160         fprintf(stderr, "Out of memory.\n");
161         exit(1);
162 }