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