summaryrefslogtreecommitdiffstats
path: root/debian/gettext-kde/gettext-kde-0.10.35/src/open-po.c
blob: aad7e6190d778277572b8737dc4f2f5d8a08398a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* open-po - search for .po file along search path list and open for reading
   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
   Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, April 1995.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <errno.h>
#include <stdio.h>
#include <sys/types.h>

#ifdef STDC_HEADERS
# include <stdlib.h>
#endif

#if defined STDC_HEADERS || HAVE_STRING_H
# include <string.h>
#else
# include <strings.h>
#endif

#include "dir-list.h"
#include "error.h"
#include "system.h"

#include <libintl.h>

#define _(str) gettext (str)

#ifndef errno
extern int errno;
#endif

/* Prototypes for helper functions.  */
extern char *xstrdup PARAMS ((const char *string));

/* This macro is used to determine the number of elements in an erray.  */
#define SIZEOF(a) (sizeof(a)/sizeof(a[0]))

/* Open the input file with the name INPUT_NAME.  The ending .po is added
   if necessary.  If INPUT_NAME is not an absolute file name and the file is
   not found, the list of directories in INPUT_PATH_LIST is searched.  */
FILE *
open_po_file (input_name, file_name)
     const char *input_name;
     char **file_name;
{
  static const char *extension[] = { "", ".po", ".pot", };
  FILE *ret_val;
  int j, k;
  const char *dir;
  const char *ext;

  if (strcmp (input_name, "-") == 0 || strcmp (input_name, "/dev/stdin") == 0)
    {
      *file_name = xstrdup (_("<stdin>"));
      return stdin;
    }

  /* We have a real name for the input file.  If the name is absolute,
     try the various extensions, but ignore the directory search list.  */
  if (*input_name == '/')
    {
      for (k = 0; k < SIZEOF (extension); ++k)
	{
	  ext = extension[k];
	  *file_name = xmalloc (strlen (input_name) + strlen (ext) + 1);
	  stpcpy (stpcpy (*file_name, input_name), ext);

	  ret_val = fopen (*file_name, "r");
	  if (ret_val != NULL || errno != ENOENT)
	    /* We found the file.  */
	    return ret_val;

	  free (*file_name);
	}

      /* File does not exist.  */
      *file_name = xstrdup (input_name);
      errno = ENOENT;
      return NULL;
    }

  /* For relative file names, look through the directory search list,
     trying the various extensions.  If no directory search list is
     specified, the current directory is used.  */
  for (j = 0; (dir = dir_list_nth (j)) != NULL; ++j)
    for (k = 0; k < SIZEOF (extension); ++k)
      {
	ext = extension[k];
	if (dir[0] == '.' && dir[1] == '\0')
	  {
	    *file_name = xmalloc (strlen(input_name) + strlen(ext) + 1);
	    stpcpy (stpcpy (*file_name, input_name), ext);
	  }
	else
	  {
	    *file_name = xmalloc (strlen (dir) + strlen (input_name)
				  + strlen (ext) + 2);
	    stpcpy (stpcpy (stpcpy (stpcpy (*file_name, dir), "/"),
			    input_name),
		    ext);
	  }

	ret_val = fopen (*file_name, "r");
	if (ret_val != NULL || errno != ENOENT)
	  return ret_val;

	free (*file_name);
      }

  /* File does not exist.  */
  *file_name = xstrdup (input_name);
  errno = ENOENT;
  return NULL;
}