home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / id-utils-3.2-src.tgz / tar.out / fsf / id-utils / libidu / fnprint.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  139 lines

  1. /* fnprint.c -- print a list of file names
  2.    Copyright (C) 1986, 1995, 1996 Free Software Foundation, Inc.
  3.    Written by Greg McGary <gkm@gnu.ai.mit.edu>
  4.  
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.  
  10.    This program is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.
  14.  
  15.    You should have received a copy of the GNU General Public License
  16.    along with this program; if not, write to the Free Software
  17.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  18.  
  19. #include <config.h>
  20. #include <stdio.h>
  21. #include "xstdlib.h"
  22. #include "xalloca.h"
  23. #include "xunistd.h"
  24. #include "idfile.h"
  25. #include "xstring.h"
  26. #include "xnls.h"
  27. #include "pathmax.h"
  28. #include "error.h"
  29.  
  30. char const *root_name __P((char const *path));
  31. char const *suff_name __P((char const *path));
  32. int common_prefix_suffix __P((struct file_link const *flink_1, struct file_link const *flink_2));
  33.  
  34. extern void usage __P((void));
  35. extern struct file_link *cw_dlink;
  36.  
  37. /* Return the file name with the suffix stripped off.  */
  38.  
  39. char const *
  40. root_name (char const *file_name)
  41. {
  42.   static char file_name_buffer[BUFSIZ];
  43.   char const *dot = strrchr (file_name, '.');
  44.  
  45.   if (dot)
  46.     {
  47.       int length = dot - file_name;
  48.       strncpy (file_name_buffer, file_name, length);
  49.       file_name_buffer[length] = '\0';
  50.     }
  51.   else
  52.     strcpy (file_name_buffer, file_name);
  53.   return file_name_buffer;
  54. }
  55.  
  56. /* Return the suffix, including the dot, or an empty string if there
  57.    is no suffix.  */
  58.  
  59. char const *
  60. suff_name (char const *file_name)
  61. {
  62.   char const *dot = strrchr (file_name, '.');
  63.   return dot ? dot : "";
  64. }
  65.  
  66. /* common_prefix_suffix returns non-zero if two file names have a
  67.    fully common directory prefix and a common suffix (i.e., they're
  68.    eligible for coalescing with brace notation.  */
  69.  
  70. int
  71. common_prefix_suffix (struct file_link const *flink_1, struct file_link const *flink_2)
  72. {
  73.   return (flink_1->fl_parent == flink_2->fl_parent
  74.       && strequ (suff_name (flink_1->fl_name), suff_name (flink_2->fl_name)));
  75. }
  76.  
  77. void
  78. print_filenames (struct file_link **flinkv, enum separator_style separator_style)
  79. {
  80.   struct file_link const *arg;
  81.   struct file_link const *dlink;
  82.   int brace_is_open = 0;
  83.  
  84.   while (*flinkv)
  85.     {
  86.       arg = *flinkv++;
  87.       if (*flinkv && (separator_style == ss_braces)
  88.       && common_prefix_suffix (arg, *flinkv))
  89.     {
  90.       if (brace_is_open)
  91.         printf (",%s", root_name (arg->fl_name));
  92.       else
  93.         {
  94.           dlink = arg->fl_parent;
  95.           if (dlink && dlink != cw_dlink)
  96.         {
  97.           char *file_name = ALLOCA (char, PATH_MAX);
  98.           maybe_relative_file_name (file_name, dlink, cw_dlink);
  99.           fputs (file_name, stdout);
  100.           putchar ('/');
  101.         }
  102.           printf ("{%s", root_name (arg->fl_name));
  103.         }
  104.       brace_is_open = 1;
  105.     }
  106.       else
  107.     {
  108.       if (brace_is_open)
  109.         printf (",%s}%s", root_name (arg->fl_name), suff_name (arg->fl_name));
  110.       else
  111.         {
  112.           char *file_name = ALLOCA (char, PATH_MAX);
  113.           maybe_relative_file_name (file_name, arg, cw_dlink);
  114.           fputs (file_name, stdout);
  115.         }
  116.       brace_is_open = 0;
  117.       if (*flinkv)
  118.         {
  119.           if (separator_style == ss_newline)
  120.         putchar ('\n');
  121.           else
  122.         putchar (' ');
  123.         }
  124.     }
  125.     }
  126.   putchar ('\n');
  127. }
  128.  
  129. enum separator_style
  130. parse_separator_style (char const *arg)
  131. {
  132.   MAYBE_RETURN_PREFIX_MATCH (arg, "braces", ss_braces);
  133.   MAYBE_RETURN_PREFIX_MATCH (arg, "space", ss_space);
  134.   MAYBE_RETURN_PREFIX_MATCH (arg, "newline", ss_newline);
  135.   error (0, 0, _("invalid `--separator' style: `%s'"), arg);
  136.   usage ();
  137.   return ss_bogus;
  138. }
  139.