/* { dg-do compile } */
/* { dg-options "-w" } */

__extension__ typedef __SIZE_TYPE__ size_t;
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
__extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;
__extension__ typedef long long int __quad_t;
__extension__ typedef unsigned long long int __u_quad_t;
__extension__ typedef __u_quad_t __dev_t;
__extension__ typedef unsigned int __uid_t;
__extension__ typedef unsigned int __gid_t;
__extension__ typedef unsigned long int __ino_t;
__extension__ typedef __u_quad_t __ino64_t;
__extension__ typedef unsigned int __mode_t;
__extension__ typedef unsigned int __nlink_t;
__extension__ typedef long int __off_t;
__extension__ typedef __quad_t __off64_t;
__extension__ typedef int __pid_t;
__extension__ typedef struct {
    int __val[2];
} __fsid_t;
__extension__ typedef long int __clock_t;
__extension__ typedef unsigned int __id_t;
typedef struct _IO_FILE FILE;
typedef struct _IO_FILE __FILE;
typedef struct {
    int __count;
    union   {
	unsigned int __wch;
	char __wchb[4];
    }
    __value;
} __mbstate_t;
typedef struct {
    __off_t __pos;
    __mbstate_t __state;
} _G_fpos_t;
typedef struct {
    __off64_t __pos;
    __mbstate_t __state;
} _G_fpos64_t;
typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
typedef struct _IO_FILE _IO_FILE;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
extern int fputs (__const char *__restrict __s, FILE * __restrict __stream);
extern char *strstr (__const char *__haystack, __const char *__needle)
     __attribute__ ((__nonnull__ (1, 2)));
     extern char *rindex (__const char *__s, int __c)   __attribute__ ((__nonnull__ (1)));
extern size_t strlen (__const char *__s) __attribute__ ((__nothrow__))
     __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
     char *mystrlwr (char *string);
     char *m_replace_filename (const char *path, const char *filename);
     typedef struct LINE {
	 char *text;
	 struct LINE *next;
	 int flags;
     } LINE;
typedef struct TOC {
    char *text;
    char *alt;
    struct TOC *next;
    int root;
    int texinfoable;
    int htmlable;
    int otherfile;
} TOC;
static int _empty_count;
extern char *_word_substitution[256];
static void _output_sorted_nested_toc (TOC ** list, unsigned int num_items);
static char *_do_text_substitution (char *input);
static int _toc_scmp (const void *e1, const void *e2)
{
  TOC *t1 = *((TOC **) e1);
  TOC *t2 = *((TOC **) e2);
  return mystricmp (t1->text, t2->text);
}
static void _output_buffered_text (void) { if (_empty_count) ; }
void _post_process_filename (char *filename)
{
  int code_scanning = 0;
  char *new_filename, *p;
  char *line;
  FILE *f1 = 0, *f2 = 0;
  if (!new_filename || strlen (new_filename) < 2)
    new_filename[strlen (filename) - 1] = 'x';
  if (!f1 || !f2)
    while ((line = m_fgets (f1)))
      {
	line = _do_text_substitution (line);
	fputs (line, f2);
      }
  if (remove (filename))
    cancel:
	if (f1)
	  if (f2)
	    if (new_filename)
	      ;
}
static void _close_html_file (FILE * file)
{
  int f;
  for (f = 0; _word_substitution[f]; f++)
    ;
}
static __attribute__((always_inline))
char * _do_text_substitution (char *input)
{
  int start, end, middle, f;
  char *temp, *found, *reader;
  for (f = 0; _word_substitution[f]; f++)
    {
      reader = input;
      while ((found = strstr (reader, _word_substitution[f])))
	{
	  start = found - input;
	  input = temp;
	  reader = temp + start + middle;
	}
    }
  return input;
}
