00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024 #include "system.h"
00025 #include "mkdeps.h"
00026
00027
00028
00029 struct deps
00030 {
00031 const char **targetv;
00032 unsigned int ntargets;
00033 unsigned int targets_size;
00034
00035 const char **depv;
00036 unsigned int ndeps;
00037 unsigned int deps_size;
00038 };
00039
00040 static const char *munge PARAMS ((const char *));
00041
00042
00043
00044
00045
00046
00047
00048
00049 static const char *
00050 munge (filename)
00051 const char *filename;
00052 {
00053 int len;
00054 const char *p, *q;
00055 char *dst, *buffer;
00056
00057 for (p = filename, len = 0; *p; p++, len++)
00058 {
00059 switch (*p)
00060 {
00061 case ' ':
00062 case '\t':
00063
00064
00065
00066
00067
00068
00069 for (q = p - 1; filename <= q && *q == '\\'; q--)
00070 len++;
00071 len++;
00072 break;
00073
00074 case '$':
00075
00076 len++;
00077 break;
00078 }
00079 }
00080
00081
00082 buffer = xmalloc (len + 1);
00083
00084 for (p = filename, dst = buffer; *p; p++, dst++)
00085 {
00086 switch (*p)
00087 {
00088 case ' ':
00089 case '\t':
00090 for (q = p - 1; filename <= q && *q == '\\'; q--)
00091 *dst++ = '\\';
00092 *dst++ = '\\';
00093 break;
00094
00095 case '$':
00096 *dst++ = '$';
00097 break;
00098
00099 default:
00100 ;
00101 }
00102 *dst = *p;
00103 }
00104
00105 *dst = '\0';
00106 return buffer;
00107 }
00108
00109
00110
00111 struct deps *
00112 deps_init ()
00113 {
00114 struct deps *d = (struct deps *) xmalloc (sizeof (struct deps));
00115
00116
00117
00118 d->targetv = 0;
00119 d->depv = 0;
00120
00121 d->ntargets = 0;
00122 d->targets_size = 0;
00123 d->ndeps = 0;
00124 d->deps_size = 0;
00125
00126 return d;
00127 }
00128
00129 void
00130 deps_free (d)
00131 struct deps *d;
00132 {
00133 unsigned int i;
00134
00135 if (d->targetv)
00136 {
00137 for (i = 0; i < d->ntargets; i++)
00138 free ((PTR) d->targetv[i]);
00139 free (d->targetv);
00140 }
00141
00142 if (d->depv)
00143 {
00144 for (i = 0; i < d->ndeps; i++)
00145 free ((PTR) d->depv[i]);
00146 free (d->depv);
00147 }
00148
00149 free (d);
00150 }
00151
00152
00153
00154 void
00155 deps_add_target (d, t, quote)
00156 struct deps *d;
00157 const char *t;
00158 int quote;
00159 {
00160 if (d->ntargets == d->targets_size)
00161 {
00162 d->targets_size = d->targets_size * 2 + 4;
00163 d->targetv = (const char **) xrealloc (d->targetv,
00164 d->targets_size * sizeof (const char *));
00165 }
00166
00167 if (quote)
00168 t = munge (t);
00169 else
00170 t = xstrdup (t);
00171
00172 d->targetv[d->ntargets++] = t;
00173 }
00174
00175
00176
00177
00178 void
00179 deps_add_default_target (d, tgt)
00180 struct deps *d;
00181 const char *tgt;
00182 {
00183
00184 if (d->ntargets)
00185 return;
00186
00187 if (tgt[0] == '\0')
00188 deps_add_target (d, "-", 1);
00189 else
00190 {
00191 #ifndef TARGET_OBJECT_SUFFIX
00192 # define TARGET_OBJECT_SUFFIX ".o"
00193 #endif
00194 const char *start = lbasename (tgt);
00195 char *o = (char *) alloca (strlen (start) + strlen (TARGET_OBJECT_SUFFIX) + 1);
00196 char *suffix;
00197
00198 strcpy (o, start);
00199
00200 suffix = strrchr (o, '.');
00201 if (!suffix)
00202 suffix = o + strlen (o);
00203 strcpy (suffix, TARGET_OBJECT_SUFFIX);
00204
00205 deps_add_target (d, o, 1);
00206 }
00207 }
00208
00209 void
00210 deps_add_dep (d, t)
00211 struct deps *d;
00212 const char *t;
00213 {
00214 t = munge (t);
00215
00216 if (d->ndeps == d->deps_size)
00217 {
00218 d->deps_size = d->deps_size * 2 + 8;
00219 d->depv = (const char **)
00220 xrealloc (d->depv, d->deps_size * sizeof (const char *));
00221 }
00222 d->depv[d->ndeps++] = t;
00223 }
00224
00225 void
00226 deps_write (d, fp, colmax)
00227 const struct deps *d;
00228 FILE *fp;
00229 unsigned int colmax;
00230 {
00231 unsigned int size, i, column;
00232
00233 column = 0;
00234 if (colmax && colmax < 34)
00235 colmax = 34;
00236
00237 for (i = 0; i < d->ntargets; i++)
00238 {
00239 size = strlen (d->targetv[i]);
00240 column += size;
00241 if (colmax && column > colmax)
00242 {
00243 fputs (" \\\n ", fp);
00244 column = 1 + size;
00245 }
00246 if (i)
00247 {
00248 putc (' ', fp);
00249 column++;
00250 }
00251 fputs (d->targetv[i], fp);
00252 }
00253
00254 putc (':', fp);
00255 putc (' ', fp);
00256 column += 2;
00257
00258 for (i = 0; i < d->ndeps; i++)
00259 {
00260 size = strlen (d->depv[i]);
00261 column += size;
00262 if (colmax && column > colmax)
00263 {
00264 fputs (" \\\n ", fp);
00265 column = 1 + size;
00266 }
00267 if (i)
00268 {
00269 putc (' ', fp);
00270 column++;
00271 }
00272 fputs (d->depv[i], fp);
00273 }
00274 putc ('\n', fp);
00275 }
00276
00277 void
00278 deps_phony_targets (d, fp)
00279 const struct deps *d;
00280 FILE *fp;
00281 {
00282 unsigned int i;
00283
00284 for (i = 1; i < d->ndeps; i++)
00285 {
00286 putc ('\n', fp);
00287 fputs (d->depv[i], fp);
00288 putc (':', fp);
00289 putc ('\n', fp);
00290 }
00291 }