summaryrefslogtreecommitdiff
path: root/utils/ossmkdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/ossmkdep.c')
-rw-r--r--utils/ossmkdep.c234
1 files changed, 234 insertions, 0 deletions
diff --git a/utils/ossmkdep.c b/utils/ossmkdep.c
new file mode 100644
index 0000000..9d33da9
--- /dev/null
+++ b/utils/ossmkdep.c
@@ -0,0 +1,234 @@
+/*
+ * Purpose: Simple replacement for cpp -M (gcc)
+ */
+/*
+ *
+ * This file is part of Open Sound System.
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This this source file is released under GPL v2 license (no other versions).
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+int ndirs = 0;
+char *dirs[1024];
+
+int ndupes = 0;
+char *dupes[4096];
+
+static void
+add_includedir (char *d)
+{
+ dirs[ndirs++] = d;
+}
+
+static int
+dupe_file (char *name)
+{
+ int i;
+
+ for (i = 0; i < ndupes; i++)
+ if (strcmp (dupes[i], name) == 0)
+ return 1;
+
+ dupes[ndupes++] = strdup (name);
+ return 0;
+}
+
+static void parse_f (FILE * f, char *pathname);
+
+static void
+do_global_include (char *hdrname, char *pathname)
+{
+ FILE *f;
+ int i;
+
+ char tmp[512];
+ sprintf (tmp, "%s/%s", pathname, hdrname);
+
+ if (dupe_file (tmp))
+ return;
+ if ((f = fopen (tmp, "r")) != NULL)
+ {
+ printf ("%s ", tmp);
+ parse_f (f, pathname);
+ fclose (f);
+ return;
+ }
+
+ for (i = 0; i < ndirs; i++)
+ {
+ sprintf (tmp, "%s/%s", dirs[i], hdrname);
+ if (dupe_file (tmp))
+ return;
+
+ if ((f = fopen (tmp, "r")) == NULL)
+ continue;
+ printf ("\\\n %s ", tmp);
+
+ parse_f (f, dirs[i]);
+ fclose (f);
+ return;
+ }
+
+ fprintf (stderr, "Cannot locate <%s>\n", hdrname);
+ printf ("\n");
+ exit (-1);
+}
+
+static void
+do_local_include (char *hdrname, char *pathname)
+{
+ FILE *f;
+ char tmp[512];
+
+ sprintf (tmp, "%s/%s", pathname, hdrname);
+
+ if (dupe_file (tmp))
+ {
+ return;
+ }
+
+ if ((f = fopen (tmp, "r")) == NULL)
+ {
+#if 1
+ do_global_include (hdrname, pathname);
+ return;
+#else
+ perror (tmp);
+ printf ("\n");
+ exit (-1);
+#endif
+ }
+
+ sprintf (tmp, "%s ", tmp);
+ parse_f (f, pathname);
+ printf ("\\\n %s ", tmp);
+
+ fclose (f);
+}
+
+static void
+parse_f (FILE * f, char *pathname)
+{
+ char line[1024], *p, *s;
+
+ while (fgets (line, sizeof (line), f) != NULL)
+ {
+ if (*line != '#')
+ continue;
+
+ s = line + 1;
+
+ /* Skip space */
+ while (*s && (*s == ' ' || *s == '\t'))
+ s++;
+
+ /* Extract the preprocessor directive name (p) */
+ p = s;
+ while (*s && (*s != ' ' && *s != '\t'))
+ s++;
+ *s++ = 0;
+
+ if (strcmp (p, "include") != 0)
+ continue;
+
+ /* Skip space */
+ while (*s && (*s == ' ' || *s == '\t'))
+ s++;
+
+ if (*s == '"')
+ {
+ s++;
+
+ p = s;
+ while (*s && *s != '"')
+ s++;
+ *s = 0;
+ do_local_include (p, pathname);
+ continue;
+ }
+
+ if (*s == '<')
+ {
+ s++;
+
+ p = s;
+ while (*s && *s != '>')
+ s++;
+ *s = 0;
+ do_global_include (p, pathname);
+ continue;
+ }
+ }
+}
+
+static void
+parse_sourcefile (char *srcname)
+{
+ FILE *f;
+ char *s, *p;
+ char origname[64];
+
+ strcpy (origname, srcname);
+
+ s = NULL;
+
+ p = srcname;
+ while (*p)
+ {
+ if (*p == '.')
+ s = p;
+ p++;
+ }
+
+ if (*s != '.')
+ {
+ fprintf (stderr, "Bad file name %s\n", srcname);
+ printf ("\n");
+ exit (-1);
+ }
+
+ if ((f = fopen (srcname, "r")) == NULL)
+ {
+ perror (srcname);
+ printf ("\n");
+ exit (-1);
+ }
+
+ *s++ = 0;
+ printf ("%s.o: %s ", srcname, origname);
+
+ parse_f (f, ".");
+ printf ("\n");
+ fclose (f);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+
+ add_includedir ("/usr/include");
+ add_includedir ("/usr/local/include");
+
+ for (i = 1; i < argc; i++)
+ if (argv[i][0] == '-')
+ switch (argv[i][1])
+ {
+ case 'I':
+ add_includedir (argv[i] + 2);
+ break;
+ }
+ else
+ parse_sourcefile (argv[i]);
+
+ exit (0);
+}