Cleaned up code in examples.
authorroland <roland>
Wed, 6 May 1992 05:06:34 +0000 (05:06 +0000)
committerroland <roland>
Wed, 6 May 1992 05:06:34 +0000 (05:06 +0000)
Replaced some examples with @include foo.c.texi.
The source is found in examples/foo.c.

12 files changed:
manual/=process.texinfo
manual/filesys.texi
manual/lang.texi
manual/pipe.texi
manual/search.texi
manual/setjmp.texi
manual/signal.texi
manual/stdio.texi
manual/string.texi
manual/terminal.texi
manual/time.texi
manual/users.texi

index 33dd08c..7a940d2 100644 (file)
@@ -228,47 +228,7 @@ A second loop is used to process the remaining non-option arguments.
 @end itemize
 
 @example
-#include <unistd.h>
-#include <stdio.h>
-
-int
-main (int argc, char **argv)
-@{
-  int aflag = 0;
-  int bflag = 0;
-  char *cvalue = NULL;
-  int index;
-  int c;
-  opterr = 0;
-
-  while ((c = getopt (argc, argv, "abc:")) >= 0)
-    switch (c) @{
-    case 'a':
-      aflag = 1;
-      break;
-    case 'b':
-      bflag = 1;
-      break;
-    case 'c':
-      cvalue = optarg;
-      break;
-    case '?':
-      if (isprint (optopt))
-       fprintf (stderr, "Unknown option %c.\n", optopt);
-      else
-        fprintf (stderr, "Unknown option character `\\x%x'", optopt);
-      return -1;
-    default:
-      abort ();
-      return -1;
-    @}
-
-  printf ("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue);
-
-  for (index = optind; index < argc; index++)
-    printf ("Non-option argument %s\n", argv[index]);
-  return 0;
-@}
+@include testopt.c.texi
 @end example
 
 Here are some examples showing what this program prints with different
index 0f4985f..11e7057 100644 (file)
@@ -296,24 +296,7 @@ Here's a simple program that prints the names of the files in
 the current working directory:
 
 @example
-#include <stddef.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <dirent.h>
-
-main ()
-@{   
-  DIR *dp;
-  struct dirent *ep;
-
-  if (dp = opendir ("./")) @{
-    while (ep = readdir (dp))
-      puts (ep->d_name);
-    closedir (dp);
-    @}
-  else
-    perror ("couldn't open working directory");
-@}
+@include dir.c.texi
 @end example
 
 The order in which files appear in a directory tends to be fairly
index 545e43a..d9e9c13 100644 (file)
@@ -411,33 +411,7 @@ arguments facility.
 
 @comment Yes, this example has been tested.
 @example
-#include <stdarg.h>
-
-int 
-add_em_up (int count, @dots{})
-@{
-  va_list ap;
-  int i, sum;
-
-  va_start (ap, count);           /* @r{Initialize the argument list.} */
-
-  sum = 0;
-  for (i = 0; i < count; i++)
-    sum = sum + va_arg (ap, int); /* @r{Get the next argument value.} */
-
-  va_end (ap);                    /* @r{Clean up.} */
-  return sum;
-@}
-
-void
-main ()
-@{
-  /* @r{This call prints 16.} */
-  printf ("%d\n", add_em_up (3, 5, 5, 6));
-
-  /* @r{This call prints 55.} */
-  printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
-@}
+@include add.c.texi
 @end example
 
 @node Null Pointer Constant
index 664641a..df82b37 100644 (file)
@@ -75,67 +75,7 @@ a child process.  The parent process writes data to the pipe, which is
 read by the child process.
 
 @example
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* @r{Read characters from the pipe and echo them to stdout.}  */
-
-void 
-read_from_pipe (int file)
-@{
-  FILE *stream;
-  int c;
-  stream = fdopen (file, "r");
-  while ((c = fgetc (stream)) != EOF)
-    putchar (c);
-  fclose (stream);
-@}
-
-/* @r{Write some random text to the pipe.} */
-
-void 
-write_to_pipe (int file)
-@{
-  FILE *stream;
-  stream = fdopen (file, "w");
-  fprintf (stream, "hello, world!\n");
-  fprintf (stream, "goodbye, world!\n");
-  fclose (stream);
-@}
-
-
-void
-main (void)
-@{
-  pid_t pid;
-  int mypipe[2];
-
-  /* @r{Create the pipe.} */
-  if (pipe (mypipe)) @{
-    perror ("pipe failed");
-    exit (EXIT_FAILURE);
-    @}
-
-  /* @r{Create the child process.} */
-  pid = fork ();
-  if (pid == (pid_t) 0) @{
-    /* @r{This is the child process.} */
-    read_from_pipe (mypipe[0]);
-    exit (EXIT_SUCCESS);
-    @}
-  else if (pid < (pid_t) 0) @{
-    /* @r{The fork failed.} */
-    perror ("fork failed");
-    exit (EXIT_FAILURE);
-    @}
-  else @{
-    /* @r{This is the parent process.} */
-    write_to_pipe (mypipe[1]);
-    exit (EXIT_SUCCESS);
-    @}
-@}
+@include pipe.c.texi
 @end example
 
 
@@ -192,28 +132,9 @@ filter output through another program, in this case the paging program
 @code{more}.
 
 @example
-#include <stdio.h>
-#include <stdlib.h>
-
-void 
-main (void)
-@{
-  FILE *output;
-
-  output = popen ("more", "w");
-  if (!output) @{
-    perror ("popen failed, running `more'");
-    exit (EXIT_FAILURE);
-    @}
-  @dots{}
-  fprintf (output, @dots{});
-  @dots{}
-  pclose (output);
-  exit (EXIT_SUCCESS);
-@}
+@include popen.c.texi
 @end example
 
-
 @node FIFO Special Files,  , Pipe to a Subprocess, Pipes and FIFOs
 @section FIFO Special Files
 @cindex creating a FIFO special file
index a0ec80f..7d30242 100644 (file)
@@ -150,89 +150,7 @@ Then, we can look up individual objects based on their names.
 
 @comment This example is dedicated to the memory of Jim Henson.  RIP.
 @example
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-/* @r{Define an array of critters to sort.} */
-
-struct critter @{
-  char *name;
-  char *species;
-  @};
-
-/* @r{Initialize the array, but not properly sorted.}  */
-
-struct critter muppets[]
-  = @{@{"Kermit", "frog"@},
-     @{"Piggy", "pig"@},
-     @{"Gonzo", "whatever"@},
-     @{"Fozzie", "bear"@},
-     @{"Sam", "eagle"@},
-     @{"Robin", "frog"@},
-     @{"Animal", "animal"@},
-     @{"Camilla", "chicken"@},
-     @{"Sweetums", "monster"@},
-     @{"Dr. Strangepork", "pig"@},
-     @{"Link Hogthrob", "pig"@},
-     @{"Zoot", "human"@},
-     @{"Dr. Bunsen Honeydew", "human"@},
-     @{"Beaker", "human"@},
-     @{"Swedish Chef", "human"@}@};
-
-int count = sizeof(muppets) / sizeof(struct critter);
-
-/* @r{This is the comparison function for sorting and searching.} */
-
-int
-critter_cmp (const struct critter *c1,
-             const struct critter *c2)
-@{
-  return strcmp (c1->name, c2->name);
-@}
-
-/* @r{Print information about a critter.} */
-
-void
-print_critter (const struct critter *c)
-@{
-  printf ("%s, the %s\n", c->name, c->species);
-@}
-
-/* @r{Do the lookup into the sorted array.} */
-
-void
-find_critter (char *name)
-@{
-  struct critter target, *result;
-  target.name = name;
-  result = bsearch (&target, muppets, count,
-                    sizeof (struct critter),
-                    critter_cmp);
-  if (result)
-    print_critter (result);
-  else
-    printf ("Couldn't find %s.\n", name);
-@}
-
-/* @r{Main program.} */
-
-void
-main (void)
-@{
-  int i;
-  
-  qsort (muppets, count,
-         sizeof (struct critter), critter_cmp);
-
-  for (i=0; i<count; i++)
-    print_critter (&muppets[i]);
-  printf ("\n");
-
-  find_critter ("Kermit");
-  find_critter ("Gonzo");
-  find_critter ("Janice");
-@}  
+@include search.c.texi
 @end example
 
 @cindex Kermit the frog
index a5de222..5f44400 100644 (file)
@@ -59,25 +59,7 @@ statement.
 Here is how the example program described above might be set up:  
 
 @example
-#include <setjmp.h>
-#include <stdio.h>
-
-jmp_buf main_loop;
-
-void abort_to_main_loop (void)
-@{
-  longjmp (main_loop, -1);
-@}
-
-main ()
-@{
-  extern void do_command (void);
-  while (1)
-    if (setjmp (main_loop))
-      printf ("Back at main loop....\n");
-    else
-      do_command ();
-@}
+@include setjmp.c.texi
 @end example
 
 The function @code{abort_to_main_loop} causes an immediate transfer of
index 8905a93..fed7ae1 100644 (file)
@@ -907,7 +907,8 @@ termination_handler (int signum)
     unlink (p->name);
 @}
 
-main ()
+int
+main (void)
 @{
   @dots{}
   if (signal (SIGINT, termination_handler) == SIG_IGN)
@@ -1078,7 +1079,8 @@ termination_handler (int signum)
     unlink (p->name);
 @}
 
-main ()
+int
+main (void)
 @{
   @dots{}
   struct sigaction new_action, old_action;
@@ -1288,38 +1290,7 @@ This technique is useful because it allows the iteration in progress
 when the signal arrives to complete before the loop exits.
 
 @example
-#include <signal.h>
-#include <stdlib.h>
-
-/* @r{This flag controls termination of the main loop.} */
-
-volatile sig_atomic_t keep_going = 1;
-
-/* @r{The signal handler just clears the flag and re-enables itself.}
-   @r{Actually, for this program re-enabling the handler isn't necessary,}
-   @r{since only one alarm signal has to be caught in order to cause it}
-   @r{to terminate.} */
-
-void
-catch_alarm (int sig)
-@{
-  keep_going = 0;
-  signal (sig, catch_alarm);
-@}
-
-main (void)
-@{
-  /* @r{Establish a handler for @code{SIGALRM} signals.} */
-  signal (SIGALRM, catch_alarm);
-
-  /* @r{Set an alarm to go off in a little while.}  */
-  alarm (2);
-
-  /* @r{Check the flag once in a while to see when to quit.} */
-  while (keep_going)
-    do_stuff ();
-  exit (EXIT_SUCCESS);
-@}      
+@include sigh1.c.texi
 @end example
 
 @node Termination in Handler, Longjmp in Handler, Handler Returns, Defining Handlers
@@ -1566,7 +1537,7 @@ interrupts.
 #include <signal.h>
 #include <stdio.h>
 
-struct two_words @{int a,b;@}
+struct two_words @{int a, b;@}
 struct two_words memory;
 
 void
@@ -1576,17 +1547,18 @@ handler(int signum)
    alarm (1);
 @}
 
-void
+int
 main ()
 @{
    static struct two_words zeros=@{0,0@}, ones=@{1,1@};
    signal (SIGALRM, handler);
    memory = zeros;
    alarm (1);
-   while (1) @{
-      memory = zeros;
-      memory = ones;
-   @}
+   while (1)
+     @{
+       memory = zeros;
+       memory = ones;
+     @}
 @}
 @end example
 
@@ -1667,11 +1639,11 @@ before stopping.  You might set this up like this:
 @example
 #include <signal.h>
 
-/* @r{When a stop signal arrives, set the action back to the default}
- * @r{and then resend the signal after doing cleanup actions.}
- */
+/* @r{When a stop signal arrives, set the action back to the default
+   and then resend the signal after doing cleanup actions.} */
 
-void tstp_handler (int sig)
+void
+tstp_handler (int sig)
 @{
   signal (SIGTSTP, SIG_DFL);
   /* @r{Do cleanup actions here.} */
@@ -1679,18 +1651,18 @@ void tstp_handler (int sig)
   raise (SIGTSTP);
 @}
 
-/* @r{When the process is continued again, restore the signal handler.}
- */
+/* @r{When the process is continued again, restore the signal handler.} */
 
-void cont_handler (int sig)
+void
+cont_handler (int sig)
 @{
   signal (SIGCONT, cont_handler);
   signal (SIGTSTP, tstp_handler);
 @}
 
-/* @r{Enable both handlers during program initialization.}
- */
+/* @r{Enable both handlers during program initialization.} */
 
+int
 main (void)
 @{
   signal (SIGCONT, cont_handler);
@@ -1857,65 +1829,7 @@ the parent when it is ready by sending it a @code{SIGUSR1} signal, using
 the @code{kill} function.
 
 @example
-#include <signal.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-/* @r{When a @code{SIGUSR1} signal arrives, set this variable.}  */
-
-volatile sig_atomic_t usr_interrupt = 0;
-
-void
-synch_signal (int sig)
-@{
-  usr_interrupt = 1;
-@}
-
-
-/* @r{The child process executes this function.}  */
-
-void
-child_function ()
-@{
-  /* @r{Perform initialization.} */
-  printf ("I'm here!!!  My pid is %d.\n", getpid ());
-
-  /* @r{Let parent know you're done.} */
-  kill (getppid (), SIGUSR1);  
-
-  /* @r{Continue with execution.} */
-  printf ("Bye, now....\n");
-  exit (0);
-@}
-
-
-void 
-main ()
-@{
-  struct sigaction usr_action;
-  sigset_t block_mask;
-  pid_t child_id;
-
-  /* @r{Establish the signal handler.} */
-  sigfillset (&block_mask);
-  usr_action.sa_handler = synch_signal;
-  usr_action.sa_mask = block_mask;
-  usr_action.sa_flags = 0;
-  sigaction (SIGUSR1, &usr_action, NULL);
-
-  /* @r{Create the child process.} */
-  if ((child_id = fork ()) == 0)
-    child_function ();  /* @r{Does not return} */
-
-  /* @r{Busy wait for child to send a signal.} */
-  while (!usr_interrupt)
-    sleep(1);
-
-  /* @r{Now continue execution.} */
-  printf ("That's all, folks!\n");
-  exit (0);
-@}
+@include sigusr.c.texi
 @end example
 
 Most of the time, the signal is delivered during a @code{sleep}, and
@@ -2179,8 +2093,8 @@ meantime by wrapping the critical part of the code with calls to
 /* @r{This variable is set by the SIGALRM signal handler.} */
 volatile sig_atomic_t flag = 0;
 
-void
-main ()
+int
+main (void)
 @{
   sigset_t block_alarm;
 
@@ -2190,18 +2104,19 @@ main ()
   sigemptyset (&block_alarm);
   sigaddset (&block_alarm, SIGALRM);
 
-  while (1) @{
-
-    /* @r{Check if a signal has arrived; if so, reset the flag.} */
-    sigprocmask (SIG_BLOCK, &block_alarm, NULL);
-    if (flag) @{
-      @var{actions-if-not-arrived}
-      flag = 0;
-      @}
-    sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
-
-    @dots{}
-  @}
+  while (1)
+    @{
+      /* @r{Check if a signal has arrived; if so, reset the flag.} */
+      sigprocmask (SIG_BLOCK, &block_alarm, NULL);
+      if (flag)
+        @{
+          @var{actions-if-not-arrived}
+          flag = 0;
+        @}
+      sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
+
+      @dots{}
+    @}
 @}
 @end example
 
@@ -2666,7 +2581,7 @@ calls should return with a @code{EINTR} error status.
 @end deftypevr
 
 @comment signal.h
-@comment BSD
+@comment Sun
 @deftypevr Macro int SV_RESETHAND
 If this bit is set in the @code{sv_flags} field of a @code{sigvec}
 structure, it means to reset the action for the signal back to
index 67c3025..a2ae21a 100644 (file)
@@ -1780,58 +1780,7 @@ structure.  The @samp{%W} conversion supports the minimum field width and
 left-justification options, but ignores everything else.
 
 @example
-#include <stdio.h>
-#include <printf.h>
-#include <stdarg.h>
-
-struct widget 
-@{
-  char *name;
-  @dots{}
-@};
-
-int
-print_widget (FILE *stream, const struct printf_info *info,
-              va_list *app)
-@{
-  struct widget *w;
-  char *buffer;
-  int padding_amount, i;
-
-  /* @r{Fetch the widget to be printed.} */
-  w = va_arg (*app, struct widget *);
-  /* @r{Format the output into a string.} */
-  padding_amount
-    = (info->width -
-       asprintf (&buffer, "<Widget %p: %s>", w, w->name));
-
-  /* @r{Pad to the minimum field width and print to the stream.} */
-  if (!info->left)
-    for (i = 0; i < padding_amount; i++) fputc (' ', stream);
-  fputs (buffer, stream);
-  if (info->left)
-    for (i = 0; i < padding_amount; i++) fputc (' ', stream);
-
-  /* @r{Clean up and return.} */
-  free (buffer);
-  return 1;
-@}
-
-void
-main (void)
-@{
-  /* @r{Make a widget to print.} */
-  struct widget mywidget;
-  mywidget.name = "mywidget";
-
-  /* @r{Register the print function for widgets.} */
-  register_printf_function ('W', print_widget, NULL);
-
-  /* @r{Now print the widget.} */
-  printf ("|%W|\n", &mywidget);
-  printf ("|%35W|\n", &mywidget);
-  printf ("|%-35W|\n", &mywidget);
-@}
+@include rprintf.c.texi
 @end example
 
 The output produced by this program looks like:
@@ -3126,21 +3075,7 @@ Here is an example of using @code{fmemopen} to create a stream for
 reading from a string:
 
 @example
-#include <stdio.h>
-
-static char buffer[] = "foobar";
-
-void
-main (void)
-@{
-  int ch;
-  FILE *stream;
-
-  stream = fmemopen (buffer, strlen(buffer), "r");
-  while ((ch = fgetc (stream)) != EOF)
-    printf ("Got %c\n", ch);
-  fclose (stream);
-@}
+@include memopen.c.texi
 @end example
 
 This program produces the following output:
@@ -3175,23 +3110,7 @@ is @emph{not} included in the size value stored at @var{sizeloc}.
 Here is an example of using @code{open_memstream}:
 
 @example
-#include <stdio.h>
-
-void
-main (void)
-@{
-  char *bp;
-  size_t size;
-  FILE *stream;
-
-  stream = open_memstream (&bp, &size);
-  fprintf (stream, "hello");
-  fflush (stream);
-  printf ("buf = `%s', size = %d\n", bp, size);
-  fprintf (stream, ", world");
-  fclose (stream);
-  printf ("buf = `%s', size = %d\n", bp, size);
-@}
+@include memstream.c.texi
 @end example
 
 This program produces the following output:
index 90ae44e..130d4b6 100644 (file)
@@ -368,21 +368,7 @@ Notice how, in the call to @code{strncat}, the @var{size} parameter
 is computed to avoid overflowing the character array @code{buffer}.
 
 @example
-#include <string.h>
-#include <stdio.h>
-
-#define SIZE 10
-
-static char buffer[SIZE];
-
-main ()
-@{
-  strncpy (buffer, "hello", SIZE);
-  printf ("%s\n", buffer);
-  /* strlen (buffer) @r{is 5, leaving room for 4 more characters.}  */
-  strncat (buffer, ", world", SIZE - strlen (buffer) - 1);
-  printf ("%s\n", buffer);
-@}
+@include strncat.c.texi
 @end example
 
 @noindent
index 001c279..678afef 100644 (file)
@@ -1387,80 +1387,7 @@ device to read single characters in noncanonical input mode, without
 echo.
 
 @example
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <termios.h>
-
-/* @r{Use this variable to remember original terminal attributes.} */
-
-struct termios saved_attributes;
-
-void
-reset_input_mode (void)
-@{
-  tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
-  signal (SIGCONT, set_input_mode);
-@}
-  
-void 
-set_input_mode (void)
-@{
-  struct termios tattr;
-  char *name;
-
-  /* @r{Make sure stdin is a terminal.} */
-  if (!isatty (STDIN_FILENO)) @{
-    fprintf (stderr, "Not a terminal.\n");
-    exit (EXIT_FAILURE);
-    @}
-
-  /* @r{Save the terminal attributes so we can restore them later.} */
-  tcgetattr (STDIN_FILENO, &saved_attributes);
-  atexit (reset_input_mode);
-
-  /* @r{Set the funny terminal modes.} */
-  tcgetattr (STDIN_FILENO, &tattr);
-  tattr.c_lflag = tattr.c_lflag & (~ICANON);   /* @r{Clear ICANON.} */
-  tattr.c_lflag = tattr.c_lflag & (~ECHO);     /* @r{Clear ECHO.} */
-  tattr.c_cc[VMIN] = 1;
-  tattr.c_cc[VTIME] = 0;
-  tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
-@}
-
-/* @r{Handle @code{SIGCONT}.} */
-void
-resumed (int sig)
-@{
-  set_input_mode ();
-@}
-
-/* @r{Handle signals that take the terminal away.} */
-void
-handler (int sig)
-@{
-  reset_input_mode ();
-  signal (sig, SIG_DFL);
-  /* @r{Make the same signal happen, with no handler.} */
-  raise (sig);
-  signal (sig, handler);
-@}
-
-void
-main (void)
-@{
-  char c;
-
-  set_input_mode ();
-  signal (SIGTERM, handler);
-  signal (SIGHUP, handler);
-  signal (SIGINT, handler);
-  signal (SIGQUIT, handler);
-  @dots{}
-  read (STDIN_FILENO, &c, 1);
-  @dots{}
-  exit (EXIT_SUCCESS);
-@}
+@include termios.c.texi
 @end example
 
 This program is careful to restore the original terminal modes before
index 6070d6f..eccba1a 100644 (file)
@@ -857,33 +857,7 @@ Here is an example program showing the use of some of the local time and
 calendar time functions.
 
 @example
-#include <time.h>
-#include <stdio.h>
-
-#define SIZE 256
-
-void
-main (void)
-@{
-  char buffer[SIZE];
-  time_t curtime;
-  struct tm *loctime;
-
-  /* @r{Get the current time.} */
-  curtime = time (NULL);
-
-  /* @r{Convert it to local time representation.} */
-  loctime = localtime (&curtime);
-
-  /* @r{Print out the date and time in the standard format.} */
-  fputs (asctime (loctime), stdout);
-
-  /* @r{Print it out in a nice format.} */
-  strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime);
-  fputs (buffer, stdout);
-  strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime);
-  fputs (buffer, stdout);
-@}
+@include strftime.c.texi
 @end example
 
 It produces output like this:
index a8cc80e..7c8a00f 100644 (file)
@@ -504,8 +504,8 @@ undo_setuid ()
 
 /* @r{Main program.} */
 
-void
-main ()
+int
+main (void)
 @{
   /* @r{Save the real and effective user IDs.}  */
   ruid = getuid ();
@@ -952,52 +952,7 @@ functions.  The program prints some information about the user running
 the program.
 
 @example
-#include <grp.h>
-#include <pwd.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-void
-main ()
-@{
-  uid_t me;
-  struct passwd *my_passwd;
-  struct group *my_group;
-  char **members;
-
-  /* @r{Get information about the user ID.} */
-  me = getuid ();
-  my_passwd = getpwuid (me);
-  if (!my_passwd) @{
-    printf ("Couldn't find out about user %d.\n", me);
-    exit (EXIT_FAILURE);
-    @}
-
-  /* @r{Print the information.} */
-  printf ("My login name is %s.\n", my_passwd->pw_name);
-  printf ("My uid is %d.\n", my_passwd->pw_uid);
-  printf ("My home directory is %s.\n", my_passwd->pw_dir);
-  printf ("My default shell is %s.\n", my_passwd->pw_shell);
-
-  /* @r{Get information about the default group ID.} */
-  my_group = getgrgid (my_passwd->pw_gid);
-  if (!my_group) @{
-    printf ("Couldn't find out about group %d.\n",
-            my_passwd->pw_gid);
-    exit (EXIT_FAILURE);
-    @}
-
-  /* @r{Print the information.} */
-  printf ("My default group is %s (%d).\n",
-         my_group->gr_name, my_passwd->pw_gid);
-  printf ("The members of this group are:\n");
-  members = my_group->gr_mem;
-  while (*members)
-    printf ("  %s\n", *members++);
-
-  exit (EXIT_SUCCESS);
-@}
+@include db.c.texi
 @end example
 
 Here is some output from this program: