xref: /freebsd/contrib/xz/src/common/tuklib_progname.c (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD
2*3b35e7eeSXin LI 
381ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
481ad8388SMartin Matuska //
581ad8388SMartin Matuska /// \file       tuklib_progname.c
681ad8388SMartin Matuska /// \brief      Program name to be displayed in messages
781ad8388SMartin Matuska //
881ad8388SMartin Matuska //  Author:     Lasse Collin
981ad8388SMartin Matuska //
1081ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
1181ad8388SMartin Matuska 
1281ad8388SMartin Matuska #include "tuklib_progname.h"
1381ad8388SMartin Matuska #include <string.h>
1481ad8388SMartin Matuska 
1581ad8388SMartin Matuska 
16047153b4SXin LI #ifndef HAVE_PROGRAM_INVOCATION_NAME
1781ad8388SMartin Matuska char *progname = NULL;
1881ad8388SMartin Matuska #endif
1981ad8388SMartin Matuska 
2081ad8388SMartin Matuska 
2181ad8388SMartin Matuska extern void
2281ad8388SMartin Matuska tuklib_progname_init(char **argv)
2381ad8388SMartin Matuska {
2481ad8388SMartin Matuska #ifdef TUKLIB_DOSLIKE
2581ad8388SMartin Matuska 	// On these systems, argv[0] always has the full path and .exe
2681ad8388SMartin Matuska 	// suffix even if the user just types the plain program name.
2781ad8388SMartin Matuska 	// We modify argv[0] to make it nicer to read.
2881ad8388SMartin Matuska 
2981ad8388SMartin Matuska 	// Strip the leading path.
3081ad8388SMartin Matuska 	char *p = argv[0] + strlen(argv[0]);
3181ad8388SMartin Matuska 	while (argv[0] < p && p[-1] != '/' && p[-1] != '\\')
3281ad8388SMartin Matuska 		--p;
3381ad8388SMartin Matuska 
3481ad8388SMartin Matuska 	argv[0] = p;
3581ad8388SMartin Matuska 
3681ad8388SMartin Matuska 	// Strip the .exe suffix.
3781ad8388SMartin Matuska 	p = strrchr(p, '.');
3881ad8388SMartin Matuska 	if (p != NULL)
3981ad8388SMartin Matuska 		*p = '\0';
4081ad8388SMartin Matuska 
4181ad8388SMartin Matuska 	// Make it lowercase.
4281ad8388SMartin Matuska 	for (p = argv[0]; *p != '\0'; ++p)
4381ad8388SMartin Matuska 		if (*p >= 'A' && *p <= 'Z')
4481ad8388SMartin Matuska 			*p = *p - 'A' + 'a';
4581ad8388SMartin Matuska #endif
4681ad8388SMartin Matuska 
4781ad8388SMartin Matuska 	progname = argv[0];
4881ad8388SMartin Matuska 	return;
4981ad8388SMartin Matuska }
50