1*86d7f5d3SJohn Marino ///////////////////////////////////////////////////////////////////////////////
2*86d7f5d3SJohn Marino //
3*86d7f5d3SJohn Marino /// \file       tuklib_progname.c
4*86d7f5d3SJohn Marino /// \brief      Program name to be displayed in messages
5*86d7f5d3SJohn Marino //
6*86d7f5d3SJohn Marino //  Author:     Lasse Collin
7*86d7f5d3SJohn Marino //
8*86d7f5d3SJohn Marino //  This file has been put into the public domain.
9*86d7f5d3SJohn Marino //  You can do whatever you want with this file.
10*86d7f5d3SJohn Marino //
11*86d7f5d3SJohn Marino ///////////////////////////////////////////////////////////////////////////////
12*86d7f5d3SJohn Marino 
13*86d7f5d3SJohn Marino #include "tuklib_progname.h"
14*86d7f5d3SJohn Marino #include <string.h>
15*86d7f5d3SJohn Marino 
16*86d7f5d3SJohn Marino 
17*86d7f5d3SJohn Marino #if !HAVE_DECL_PROGRAM_INVOCATION_NAME
18*86d7f5d3SJohn Marino char *progname = NULL;
19*86d7f5d3SJohn Marino #endif
20*86d7f5d3SJohn Marino 
21*86d7f5d3SJohn Marino 
22*86d7f5d3SJohn Marino extern void
tuklib_progname_init(char ** argv)23*86d7f5d3SJohn Marino tuklib_progname_init(char **argv)
24*86d7f5d3SJohn Marino {
25*86d7f5d3SJohn Marino #ifdef TUKLIB_DOSLIKE
26*86d7f5d3SJohn Marino 	// On these systems, argv[0] always has the full path and .exe
27*86d7f5d3SJohn Marino 	// suffix even if the user just types the plain program name.
28*86d7f5d3SJohn Marino 	// We modify argv[0] to make it nicer to read.
29*86d7f5d3SJohn Marino 
30*86d7f5d3SJohn Marino 	// Strip the leading path.
31*86d7f5d3SJohn Marino 	char *p = argv[0] + strlen(argv[0]);
32*86d7f5d3SJohn Marino 	while (argv[0] < p && p[-1] != '/' && p[-1] != '\\')
33*86d7f5d3SJohn Marino 		--p;
34*86d7f5d3SJohn Marino 
35*86d7f5d3SJohn Marino 	argv[0] = p;
36*86d7f5d3SJohn Marino 
37*86d7f5d3SJohn Marino 	// Strip the .exe suffix.
38*86d7f5d3SJohn Marino 	p = strrchr(p, '.');
39*86d7f5d3SJohn Marino 	if (p != NULL)
40*86d7f5d3SJohn Marino 		*p = '\0';
41*86d7f5d3SJohn Marino 
42*86d7f5d3SJohn Marino 	// Make it lowercase.
43*86d7f5d3SJohn Marino 	for (p = argv[0]; *p != '\0'; ++p)
44*86d7f5d3SJohn Marino 		if (*p >= 'A' && *p <= 'Z')
45*86d7f5d3SJohn Marino 			*p = *p - 'A' + 'a';
46*86d7f5d3SJohn Marino #endif
47*86d7f5d3SJohn Marino 
48*86d7f5d3SJohn Marino 	progname = argv[0];
49*86d7f5d3SJohn Marino 	return;
50*86d7f5d3SJohn Marino }
51