delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2007/06/01/04:45:45

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
Subject: Re: Finding a program's base directory
From: "Rod Pemberton" <do_not_have AT nowhere DOT cmm>
Date: Fri, 1 Jun 2007 04:34:20 -0400
Message-ID: <1180687965_206@qrz.fr>
References: <465ea4ec$0$23146$9b4e6d93 AT newsspool1 DOT arcor-online DOT net>
Lines: 64
NNTP-Posting-Host: 68.60.59.250
Newsgroups: comp.os.msdos.djgpp
X-Trace: qrz.fr 1180687965 68.60.59.250 (1 Jun 2007 10:52:45 0200)
MIME-Version: 1.0
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1437
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441
x-abuse: abuse AT qrz DOT fr AND the abuse of the isp poster
x-info: http://tinyurl.com/2vqtu6
x-info: news://nntp.qrz.fr/qrzfr.general
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

"Robert Riebisch" <Robert DOT Riebisch AT arcor DOT de> wrote in message
news:465ea4ec$0$23146$9b4e6d93 AT newsspool1 DOT arcor-online DOT net...
> Hi!
>
> I want to find a program's base directory. Program binary is in, e.g.,
> `C:\PROGRAMS\FOO\BIN\BAR.EXE'. get_base_dir() is called with argv[0] in
> pgm and shall return `C:\PROGRAMS\FOO'.
>
> The following code works for me, but as I'm no C expert, I want you to
> have a look at it.

> Specifically I'm not sure about the `base_path !=
> NULL' comparison. Is it necessary or just a waste? Thanks in advance!
>

Waste.

Since, base_path is an object, and therefore isn't NULL when declared, and
strncpy() can't modify it's first argument (passed by value) i.e.,
base_path, base_path can never be NULL.  strncpy() also returns it's first
argument.  So, it doesn't return NULL.

You might want to check that BIN is the final directory. It might be
something else.

I don't use many qualifiers, so someone else will need to comment on whether
'static' is correctly used.

> ***
> # ifdef __DJGPP__
> #  include <crt0.h>
> int _crt0_startup_flags = _CRT0_FLAG_USE_DOS_SLASHES;
> #  endif
> ***
>
> ***
> static char *get_base_dir(char *pgm)
> {
>    static char base_path[MAX_PATH_LEN];
>    char *p;
>
>    strncpy (base_path, pgm, MAX_PATH_LEN);
>    if (base_path != NULL)
>      {
> /* drop file name */
> p = strrchr (base_path, '\\');
> if (p != NULL)
>   {
>      *p = '\0';
>      /* drop also 'bin' */
>      p = strrchr (base_path, '\\');
>      if (p != NULL)
>        *p = '\0';
>   }
>      }
>    return base_path;
> }
> ***
>


Rod Pemberton

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019