summaryrefslogtreecommitdiff
path: root/src/file.c
blob: 2f0b411f7946f5028f68cca94d0baaa0073cb791 (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
/*
 file.c -- File and file name handling;

 Copyright (C) 2013, 2014, 2015 Bruno Félix Rezende Ribeiro <[email protected]>

 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 3, 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, see <http://www.gnu.org/licenses/>.
*/

/**
 * \file       file.c
 * \brief      File and file name handling
 */


#define _GNU_SOURCE

#include <config.h>
#include <stdlib.h>
#include <string.h>

#include "array.h"
#include "errors.h"
#include "file.h"


char *
make_reference_name (const char *filename, const int dirname_flag)
{
  char *str, *str_end;

  /* Don't modify the original string 'FILENAME', generate your own
     copy of it in 'str'.  If 'dirname_flag' is true, conserve the
     components names, otherwise only take the base name. */
  if (dirname_flag) str = xstrdup (filename);
  else str = xstrdup (basename (filename));

  /* To make a reference name it's necessary to discard any possible
     extension from the file name.  If 'STR' has an extension,
     it's all trailing the last dot.  Try to find that last dot.*/
  str_end = strrchr (str, '.');

  /* If you have found the referred dot, 'STR' has an extension, thus
     free the space occupied by it and mark the new end of 'STR': the
     location of that last dot. */
  if (str_end != NULL)
    {
      str = realloc (str, str_end - str + 1);
      *str_end = '\0';
    }

  /* Return to the caller the wanted reference name */
  return str;
}