xref: /dflybsd-src/contrib/xz/src/common/tuklib_progname.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino ///////////////////////////////////////////////////////////////////////////////
286d7f5d3SJohn Marino //
386d7f5d3SJohn Marino /// \file       tuklib_progname.c
486d7f5d3SJohn Marino /// \brief      Program name to be displayed in messages
586d7f5d3SJohn Marino //
686d7f5d3SJohn Marino //  Author:     Lasse Collin
786d7f5d3SJohn Marino //
886d7f5d3SJohn Marino //  This file has been put into the public domain.
986d7f5d3SJohn Marino //  You can do whatever you want with this file.
1086d7f5d3SJohn Marino //
1186d7f5d3SJohn Marino ///////////////////////////////////////////////////////////////////////////////
1286d7f5d3SJohn Marino 
1386d7f5d3SJohn Marino #include "tuklib_progname.h"
1486d7f5d3SJohn Marino #include <string.h>
1586d7f5d3SJohn Marino 
1686d7f5d3SJohn Marino 
1786d7f5d3SJohn Marino #if !HAVE_DECL_PROGRAM_INVOCATION_NAME
1886d7f5d3SJohn Marino char *progname = NULL;
1986d7f5d3SJohn Marino #endif
2086d7f5d3SJohn Marino 
2186d7f5d3SJohn Marino 
2286d7f5d3SJohn Marino extern void
tuklib_progname_init(char ** argv)2386d7f5d3SJohn Marino tuklib_progname_init(char **argv)
2486d7f5d3SJohn Marino {
2586d7f5d3SJohn Marino #ifdef TUKLIB_DOSLIKE
2686d7f5d3SJohn Marino 	// On these systems, argv[0] always has the full path and .exe
2786d7f5d3SJohn Marino 	// suffix even if the user just types the plain program name.
2886d7f5d3SJohn Marino 	// We modify argv[0] to make it nicer to read.
2986d7f5d3SJohn Marino 
3086d7f5d3SJohn Marino 	// Strip the leading path.
3186d7f5d3SJohn Marino 	char *p = argv[0] + strlen(argv[0]);
3286d7f5d3SJohn Marino 	while (argv[0] < p && p[-1] != '/' && p[-1] != '\\')
3386d7f5d3SJohn Marino 		--p;
3486d7f5d3SJohn Marino 
3586d7f5d3SJohn Marino 	argv[0] = p;
3686d7f5d3SJohn Marino 
3786d7f5d3SJohn Marino 	// Strip the .exe suffix.
3886d7f5d3SJohn Marino 	p = strrchr(p, '.');
3986d7f5d3SJohn Marino 	if (p != NULL)
4086d7f5d3SJohn Marino 		*p = '\0';
4186d7f5d3SJohn Marino 
4286d7f5d3SJohn Marino 	// Make it lowercase.
4386d7f5d3SJohn Marino 	for (p = argv[0]; *p != '\0'; ++p)
4486d7f5d3SJohn Marino 		if (*p >= 'A' && *p <= 'Z')
4586d7f5d3SJohn Marino 			*p = *p - 'A' + 'a';
4686d7f5d3SJohn Marino #endif
4786d7f5d3SJohn Marino 
4886d7f5d3SJohn Marino 	progname = argv[0];
4986d7f5d3SJohn Marino 	return;
5086d7f5d3SJohn Marino }
51