This is an automated email from the git hooks/post-receive script. rubund-guest pushed a commit to branch master in repository fyba.
commit 8f5202b6f26090d845e4a9da439d351e09f5d399 Author: Thomas Hirsch <thomas.hir...@statkart.no> Date: Tue Oct 15 10:18:34 2013 +0200 replace FULLPATH and SPLITPTH with non-proprietary alternative --- src/UT/FULLPATH.cpp | 253 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/UT/Makefile.am | 2 +- src/UT/SPLITPTH.cpp | 161 +++++++++++++++++++++++++++++++++ 3 files changed, 415 insertions(+), 1 deletion(-) diff --git a/src/UT/FULLPATH.cpp b/src/UT/FULLPATH.cpp new file mode 100644 index 0000000..cd56ec9 --- /dev/null +++ b/src/UT/FULLPATH.cpp @@ -0,0 +1,253 @@ +/* ------------------------------ + * Fil: FullPath.c + * ------------------------------ */ + +#include "stdafx.h" +#include <stdlib.h> +#include <string.h> + +#ifdef LINUX +# include <unistd.h> +#endif + +#ifdef UNIX +# include <ctype.h> +#endif + +#ifdef OS2 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include <os2.h> +#endif + +#ifdef BORLAND +# include <windows.h> +#endif + +#ifdef WIN32 +# include <windows.h> +#endif + +#include "fyut.h" + + +#ifdef UNIX + +#define wchar_t char +#define wcschr strchr + +/////////////////////////////////////////////////////////////////////////////////////// +// FULLPATH.cpp + +/////////////////////////////////////////////////////////////////////////////////////// +// ErSlash() +int ErSlash (int chr) +{ + return (chr == '\\' || chr == '/'); +} + +/////////////////////////////////////////////////////////////////////////////////////// +// FullPath() +wchar_t * FullPath(wchar_t *Buffer, + const wchar_t *PathName, + size_t nMaxlen + ) +{ + wchar_t *TempBuf; + wchar_t *dst, *src; + int c, Drive; + size_t nLen; + + + /* Allocate a temporary buffer to hold the fully qualified path. + */ + if ((TempBuf = (wchar_t*)malloc(_MAX_PATH*2+1)) == NULL) + return (NULL); + + + Drive = 7; + src = (wchar_t *)PathName; + + + /* If supplied path is relative, append it to the drivename + * and its current directory. Otherwise append it to the + * drivename only. + */ + if (!ErSlash(src[0])) { /* path is relative? */ + /* Get drivename and its current directory. + */ + if (getcwd(TempBuf,_MAX_PATH*2+1) == NULL) { + free(TempBuf); + return (NULL); + } + dst = &TempBuf[strlen(TempBuf)]; + if (!ErSlash(*(dst-1))) /* if directory doesn't end in slash */ + *dst++ = UT_SLASH; /* append one */ + + } else { + /* Path is absolute. Store the drivename only.*/ + dst = TempBuf; + } + strcpy(dst,src); /* concatenate supplied path */ + + /* Scan the path, squeezing out "../" and "./", and + * squeezing out the previous directory when "../" is found. + */ + src = dst = TempBuf; + + for (;;) { + /* If this the end of the path, or end of a directory, + * we must check for "." or ".." + */ + if ((c = *src++) == '\0' || ErSlash(c)) { + /* If last directory copied was "/.", back up over it. + * Skip test if we are still at the beginning of TempBuf. + */ + if (src != (TempBuf+1)) { + if (*(dst-1) == '.' && ErSlash(*(dst-2))) { + dst -= 2; + + /* If last directory copied was "/..", back up over it + * AND the previous directory. + */ + } else if (*(dst-1) == '.' && *(dst-2) == '.' && ErSlash(*(dst-3))) { + dst -= 3; /* back up over "/.." */ + if (*(dst-1) == ':') { /* can't back up over drivename */ + free(TempBuf); + return(NULL); + } + while (!ErSlash(*--dst)) + ; /* back up to start of prev. dir. */ + } + + if (c == '\0') { /* end of path? */ + if (ErSlash(*(dst-1))) /* if last wchar_t is slash */ + dst--; /* back up over it */ + if (*(dst-1) == ':') /* if path is just a drivename */ + *dst++ = '/'; /* append a slash */ + *dst = '\0'; /* append null terminator */ + break; + + } else { + *dst++ = c; /* copy the slash */ + } + } + + } else { + *dst++ = c; /* copy the character */ + } + } + + /* Copy the temp buffer to the user's buffer, if present. + * Otherwise shrink the temp buffer and return a pointer to it. + */ + nLen = strlen(TempBuf) + 1; /* length of path and null */ + if (Buffer != NULL) { + if (nLen > nMaxlen) { /* user buffer too small? */ + free(TempBuf); + return (NULL); + + } else { + strcpy(Buffer,TempBuf); + free(TempBuf); + return (Buffer); + } + + } else { + return (wchar_t*)(realloc(TempBuf,nLen)); /* shrink the buffer */ + } +} +#endif + + +/* +AR-930423 +CH UT_FullPath Finn fullstendig filnavn +CD ================================================================== +CD Form�l: +CD Lag absolutt path navn fra relativt path navn. +CD I tilleg tolker denne environment-variabler inn i filnavnet. +CD Environment-varialen skrives i parantes. +CD +CD Eks: +CD SET FKB=D:\DATA\SOSI\FKB +CD +CD Filnavnet (FKB)\CV03851V.SOS +CD pakkes ut til D:\DATA\SOSI\FKB\CV03851V.SOS +CD +CD PARAMETERLISTE: +CD Type Navn I/U Merknad +CD ------------------------------------------------------------------ +CD wchar_t *pszBuffer u Komplett filnavn +CD const wchar_t *pszPath i Forkortet filnavn +CD size_t maxlen i Max lengde av pszBuffer +CD short sStatus r Status; 0=OK, annen verdi er feil. +CD +CD Bruk: sStatus = UT_FullPath(szBuffer,szPath,maxlen); + ================================================================== +*/ +SK_EntPnt_UT short UT_FullPath(wchar_t *pszBuffer, const wchar_t *pszPath, size_t maxlen) +{ + wchar_t szFilnavn[_MAX_PATH]; + wchar_t *pszStart,*pszSlutt; + wchar_t *env; +#ifdef BORLAND + wchar_t *pszOrgPath; +#endif + + /* S�k start- og sluttparantes */ + UT_StrCopy(szFilnavn,pszPath,_MAX_PATH); + pszStart = wcschr(szFilnavn,'('); + pszSlutt = wcschr(szFilnavn,')'); + + /* B�de start- og sluttparantes er funnet, + og starten er f�rst i strengen */ + if (pszStart != NULL && pszSlutt != NULL && pszStart < pszSlutt) { + *pszStart++ = '\0'; + *pszSlutt++ = '\0'; +#ifdef LINUX + env = getenv( UT_StrUpper(pszStart)); +#else + size_t len; + _wdupenv_s(&env, &len, UT_StrUpper(pszStart)); +#endif + + /* Navnet er ikke funnet */ + if (env == NULL) { + UT_StrCopy(szFilnavn,pszPath,_MAX_PATH); + + } else { + UT_StrCat(szFilnavn,env,_MAX_PATH); + UT_ClrTrailsp(szFilnavn); + UT_StrCat(szFilnavn,pszPath+(pszSlutt-szFilnavn),_MAX_PATH); + } + } + + /* Hent filopplysninger */ +#ifdef UNIX + return (short)(FullPath(pszBuffer,szFilnavn,maxlen) != NULL)? 0 : 1; +#endif + +#ifdef OS232 + return (short) DosQueryPathInfo(szFilnavn,FIL_QUERYFULLNAME,pszBuffer,maxlen); +#endif + +#ifdef OS216 + return (short) DosQPathInfo(szFilnavn,FIL_QUERYFULLNAME,(PBYTE)pszBuffer,(USHORT)maxlen,0); +#endif + +#ifdef WIN32 + return (short)(_wfullpath(pszBuffer,szFilnavn,maxlen) != NULL)? 0 : 1; +#endif + +#ifdef BORLAND + pszOrgPath = FullPath(pszBuffer,szFilnavn,maxlen); + + if (pszOrgPath != NULL) + return((short)0); + else + return ((short)1); +#endif + +} + diff --git a/src/UT/Makefile.am b/src/UT/Makefile.am index 66cd768..450aba0 100644 --- a/src/UT/Makefile.am +++ b/src/UT/Makefile.am @@ -2,7 +2,7 @@ AM_CPPFLAGS = --pedantic -Wno-long-long -Wall -O2 -D_FILE_OFFSET_BITS=64 -DUNIX ACLOCAL_AMFLAGS = -I m5 lib_LTLIBRARIES = libfyut.la -libfyut_la_SOURCES = ANFORSEL.cpp DELDIR.cpp FILNACMP.cpp INQTID.cpp UT1.cpp UT4.cpp CopyFile.cpp DELFILE.cpp MAKEPATH.cpp stdafx.cpp UT2.cpp CREDIR.cpp DISKINFO.cpp INQSIZE.cpp SETSIZE.cpp StrtPros.cpp UT3.cpp fyut.h stdafx.h +libfyut_la_SOURCES = ANFORSEL.cpp DELDIR.cpp FILNACMP.cpp INQTID.cpp UT1.cpp UT4.cpp CopyFile.cpp DELFILE.cpp MAKEPATH.cpp stdafx.cpp UT2.cpp CREDIR.cpp DISKINFO.cpp INQSIZE.cpp SETSIZE.cpp StrtPros.cpp UT3.cpp fyut.h stdafx.h FULLPATH.cpp SPLITPTH.cpp libfyut_la_LDFLAGS = -version-info 0:0:0 library_includedir=$(includedir)/fyba diff --git a/src/UT/SPLITPTH.cpp b/src/UT/SPLITPTH.cpp new file mode 100644 index 0000000..d833085 --- /dev/null +++ b/src/UT/SPLITPTH.cpp @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////////////////////////////////// +// SPLITPATH.cpp +// +// Funksjoner +// PrikkFunnet - sjekker etter spesielle kataloger +// UT_splitpath - split a full path name (MSC compatible) +// + +#include "stdafx.h" +#include <string.h> + +#ifdef BORLAND +#include <windows.h> +#endif + +#ifdef WIN32 +#include <windows.h> +#endif + +#include "fyut.h" + +#ifdef LINUX +#define wchar_t char +#define wcslen strlen +#endif + +/////////////////////////////////////////////////////////////////////// +// +// PrikkFunnet - sjekker etter spesielle kataloger + +static size_t PrikkFunnet(wchar_t *pB) +{ + if (*(pB-1) == '.') + pB--; + switch (*--pB) { + case ':' : + if (*(pB-2) != '\0') { + break; + } else { + return UT_TRUE; + } + case '/' : + case '\\' : + case '\0' : + return UT_TRUE; + } + return UT_FALSE; +} + +////////////////////////////////////////////////////////////////////////////////////// +// UT_splitpath - splits a full path name into its components + +/* +AR-930423 +CH UT_splitpath Splitt filnavn +CD ================================================================== +CD Form�l: +CD UT_splitpath splitter et fullstendig filnavn i enkelte komponenter. +CD Filnavnet: X:\DIR\SUBDIR\NAME.EXT +CD blir til: X er drive +CD \DIR\SUBDIR\ er gitt av dir +CD NAME.EXT er gitt av name og ext +CD +CD PARAMETERLISTE: +CD Type Navn I/U Merknad +CD -------------------------------------------------------------- +CD wchar_t *pszPath i Komplett filnavn +CD const wchar_t *pszDrive u Disk +CD const wchar_t *pszDir u Katalog +CD const wchar_t *pszNavn u Navn +CD const wchar_t *pszExt u Extension +CD +CD Bruk: UT_splitpath(szPath,szDrive,szDir,szNavn,szExt); + ================================================================== +*/ +SK_EntPnt_UT void UT_splitpath(const wchar_t *pathP, wchar_t *driveP, wchar_t *dirP, wchar_t *nameP, wchar_t *extP) +{ + wchar_t *pB; + size_t Wrk; + int ExtFunnet; + + wchar_t buf[ _MAX_PATH+2 ]; + + /* + * Set all string to default value zero + */ + ExtFunnet = UT_FALSE; + if (driveP) + *driveP = 0; + if (dirP) + *dirP = 0; + if (nameP) + *nameP = 0; + if (extP) + *extP = 0; + + /* + * Copy filename into template up to _MAX_PATH characters + */ + pB = buf; + while (*pathP == ' ') + pathP++; + + if ((Wrk = wcslen(pathP)) >= _MAX_PATH) + Wrk = _MAX_PATH - 1; + *pB++ = 0; + UT_StrCopy(pB, pathP, Wrk+1); + + *(pB += Wrk) = 0; + + /* + * Split the filename and fill corresponding nonzero pointers + */ + Wrk = 0; + for (; ; ) { + switch (*--pB) { + case '.' : + if (!Wrk && (*(pB+1) == '\0')) + Wrk = PrikkFunnet(pB); + if ((!Wrk) && (!ExtFunnet)) { + ExtFunnet = UT_TRUE; + UT_StrCopy(extP, pB, _MAX_EXT); + *pB = 0; + } + continue; + case ':' : + if (pB != &buf[2]) + continue; + case '\0' : + if (Wrk) { + pB++; + UT_StrCopy(dirP, pB, _MAX_DIR); + *pB-- = 0; + break; + } + case '/' : + case '\\' : + if (!Wrk) { + Wrk++; + pB++; + UT_StrCopy(nameP, pB, _MAX_FNAME); + *pB-- = 0; + if (*pB == 0 || (*pB == ':' && pB == &buf[2])) + break; + } + continue; + + case '*' : + case '?' : + continue; + + default : + continue; + } + break; + } + + if (*pB == ':') { + UT_StrCopy(driveP, &buf[1], _MAX_DRIVE); + } +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/fyba.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel