+
+/* Decompose FILENAME in four parts: *BASE, *TAB, and *EXT, the fourth
+   part, (the directory) is ranging from FILENAME to the char before
+   *BASE, so we don't need an additional parameter.
+
+   *EXT points to the last period in the basename, or NULL if none.
+
+   If there is no *EXT, *TAB is NULL.  Otherwise, *TAB points to
+   `.tab' or `_tab' if present right before *EXT, or is NULL. *TAB
+   cannot be equal to *BASE.
+
+   None are allocated, they are simply pointers to parts of FILENAME.
+   Examples:
+
+   '/tmp/foo.tab.c' -> *BASE = 'foo.tab.c', *TAB = '.tab.c', *EXT =
+   '.c'
+
+   'foo.c' -> *BASE = 'foo.c', *TAB = NULL, *EXT = '.c'
+
+   'tab.c' -> *BASE = 'tab.c', *TAB = NULL, *EXT = '.c'
+
+   '.tab.c' -> *BASE = '.tab.c', *TAB = NULL, *EXT = '.c'
+
+   'foo.tab' -> *BASE = 'foo.tab', *TAB = NULL, *EXT = '.tab'
+
+   'foo_tab' -> *BASE = 'foo_tab', *TAB = NULL, *EXT = NULL
+
+   'foo' -> *BASE = 'foo', *TAB = NULL, *EXT = NULL.  */
+
+static void
+filename_split (const char *filename,
+               const char **base, const char **tab, const char **ext)
+{
+  *base = base_name (filename);
+
+  /* Look for the extension, i.e., look for the last dot. */
+  *ext = strrchr (*base, '.');
+  *tab = NULL;
+
+  /* If there is an exentension, check if there is a `.tab' part right
+     before.  */
+  if (*ext
+      && (*ext - *base) > (int) strlen (".tab")
+      && (!strncmp (*ext - strlen (".tab"), ".tab", strlen (".tab"))
+         || !strncmp (*ext - strlen ("_tab"), "_tab", strlen ("_tab"))))
+    *tab = *ext - strlen (".tab");
+}
+
+