Updated src/exiv2.1 to cover -g option. Simplified exiv2 -v -V support code.

v0.27.3
Robin Mills 13 years ago
parent 1cfef04fb0
commit 6119b4432b

@ -3,7 +3,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH EXIV2 1 "Oct 18, 2012" .TH EXIV2 1 "Nov 11, 2012"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -294,6 +294,20 @@ with the 'print' option -pp.
X : Extract metadata to an XMP sidecar file <file>.xmp. The remaining X : Extract metadata to an XMP sidecar file <file>.xmp. The remaining
extract targets determine what metadata to extract to the sidecar extract targets determine what metadata to extract to the sidecar
file. Possible are Exif, IPTC and XMP and the default is all of these. file. Possible are Exif, IPTC and XMP and the default is all of these.
.TP
.B \-g \fImatch\fP
Report only keys which match. This is sub-string match and not grep, although
the -g option is intended to help you remember this as grep. The match is case-sensitive.
.br
.sp 1
.nf
exiv2 -g Date -pt R.jpg
Exif.Image.DateTime Ascii 20 2012:08:07 16:01:05
Exif.Photo.DateTimeOriginal Ascii 20 2011:09:18 16:25:48
Exif.Photo.DateTimeDigitized Ascii 20 2011:09:18 16:25:48
.fi
.sp 1
.TP .TP
.B \-r \fIfmt\fP .B \-r \fIfmt\fP
Filename format for the 'rename' action. The format string follows Filename format for the 'rename' action. The format string follows

@ -71,8 +71,11 @@ namespace Exiv2 {
} }
} // namespace Exiv2 } // namespace Exiv2
#include <string>
#include <stdio.h> #include <vector>
using namespace std;
typedef vector<string> string_v;
typedef string_v::iterator string_i;
#ifndef lengthof #ifndef lengthof
#define lengthof(x) sizeof(x)/sizeof(x[0]) #define lengthof(x) sizeof(x)/sizeof(x[0])
@ -116,13 +119,11 @@ namespace Exiv2 {
EXIV2API void dumpLibraryInfo(std::ostream& os) EXIV2API void dumpLibraryInfo(std::ostream& os)
{ {
char path [500]; string_v libs; // libs[0] == executable
char szBuilder[200]; char builder[200];
size_t path_l = 0 ; builder[0] = 0 ;
size_t path_max = sizeof(path) - 2;
bool bReport = false;
int bits = sizeof(void*);
int bits = sizeof(void*);
#if defined(_DEBUG) || defined(DEBUG) #if defined(_DEBUG) || defined(DEBUG)
int debug=1; int debug=1;
#else #else
@ -136,51 +137,56 @@ EXIV2API void dumpLibraryInfo(std::ostream& os)
#endif #endif
#if defined(_MSC_VER) #if defined(_MSC_VER)
sprintf(szBuilder,"MSVC=%d,DEBUG=%d,DLL=%d,Bits=%d:",((_MSC_VER-600)/100),debug,dll,bits); sprintf(builder,"MSVC=%d,DEBUG=%d,DLL=%d,Bits=%d:",((_MSC_VER-600)/100),debug,dll,bits);
#elif defined(__clang__) #elif defined(__clang__)
sprintf(szBuilder,"Clang=%s,DEBUG=%d,DLL=%d,Bits=%d:",__clang_version__,debug,dll,bits); sprintf(builder,"Clang=%s,DEBUG=%d,DLL=%d,Bits=%d:",__clang_version__,debug,dll,bits);
#elif defined(__GNUG__) #elif defined(__GNUG__)
sprintf(szBuilder,"G++=%s,DEBUG=%d,DLL=%d,Bits=%d: ",__VERSION__,debug,dll,bits); sprintf(builder,"G++=%s,DEBUG=%d,DLL=%d,Bits=%d: ",__VERSION__,debug,dll,bits);
#elif defined(__GNUC__) #elif defined(__GNUC__)
sprintf(szBuilder,"GCC=%s,DEBUG=%d,DLL=%d,Bits=%d: ",__VERSION__,debug,dll,bits); sprintf(builder,"GCC=%s,DEBUG=%d,DLL=%d,Bits=%d: ",__VERSION__,debug,dll,bits);
#else #else
sprintf(szBuilder,"???=%s,DEBUG=%d,DLL=%d,Bits=%d: ",__VERSION__,debug,dll,bits); sprintf(builder,"unknown=%s,DEBUG=%d,DLL=%d,Bits=%d: ",__VERSION__,debug,dll,bits);
#endif
const char* platform =
#if defined(__CYGWIN__)
"cygwin";
#elif defined(__MSC_VER)
"windows";
#elif defined(__APPLE__)
"apple";
#elif defined(__linux__)
"linux";
#else
"unknown";
#endif #endif
path[0]=0;
// enumerate loaded libraries and determine path to executable
#if defined(WIN32) || defined(__CYGWIN__) #if defined(WIN32) || defined(__CYGWIN__)
bReport = true; // enumerate loaded libraries and determine path to executable
HMODULE handles[100]; HMODULE handles[200];
DWORD cbNeeded; DWORD cbNeeded;
if ( EnumProcessModules(GetCurrentProcess(),handles,lengthof(handles),&cbNeeded)) { if ( EnumProcessModules(GetCurrentProcess(),handles,lengthof(handles),&cbNeeded)) {
char szFilename[_MAX_PATH]; char szFilename[_MAX_PATH];
for ( DWORD h = 0 ; h < cbNeeded/sizeof(handles[0]) ; h++ ) { for ( DWORD h = 0 ; h < cbNeeded/sizeof(handles[0]) ; h++ ) {
GetModuleFileNameA(handles[h],szFilename,lengthof(szFilename)) ; GetModuleFileNameA(handles[h],szFilename,lengthof(szFilename)) ;
os << szBuilder << "module=" << szFilename << std::endl; libs.push_back(szFilename);
if ( h==0 ) {
path_l = strlen(szFilename);
if ( path_l > path_max ) path_l = 0;
if ( path_l > 0 ) strcpy(path,szFilename);
}
} }
} }
#elif defined(__APPLE__) #elif defined(__APPLE__)
bReport = true;
// man 3 dyld // man 3 dyld
uint32_t count = _dyld_image_count(); uint32_t count = _dyld_image_count();
for (uint32_t image = 0 ; image < count ; image++ ) { for (uint32_t image = 0 ; image < count ; image++ ) {
const char* image_path = _dyld_get_image_name(image); const char* image_path = _dyld_get_image_name(image);
os << szBuilder << "library=" << image_path << std::endl; libs.push_back(image_path);
if ( image==0 ) {
path_l = strlen(image_path);
if ( path_l > path_max ) path_l = 0;
if ( path_l > 0 ) strcpy(path,image_path);
}
} }
#elif defined(__linux__) #elif defined(__linux__)
bReport = true; // http://stackoverflow.com/questions/606041/how-do-i-get-the-path-of-a-process-in-unix-linux
char proc[100];
char path[500];
sprintf(proc,"/proc/%d/exe", getpid());
path_l = readlink (proc, path,sizeof(path));
libs.push_back(path);
// http://syprog.blogspot.com/2011/12/listing-loaded-shared-objects-in-linux.html // http://syprog.blogspot.com/2011/12/listing-loaded-shared-objects-in-linux.html
struct lmap* pl; struct lmap* pl;
void* ph = dlopen(NULL, RTLD_NOW); void* ph = dlopen(NULL, RTLD_NOW);
@ -190,21 +196,18 @@ EXIV2API void dumpLibraryInfo(std::ostream& os)
while(NULL != pl) while(NULL != pl)
{ {
os << szBuilder << "library=" << pl->path << std::endl; libraries.push_back(pl->path);
pl = pl->next; pl = pl->next;
} }
// http://stackoverflow.com/questions/606041/how-do-i-get-the-path-of-a-process-in-unix-linux
char proc[100];
sprintf(proc,"/proc/%d/exe", getpid());
path_l = readlink (proc, path, path_max);
#endif #endif
if ( bReport ) { os << "platform=" << platform << endl;
os << "builder=" << szBuilder << std::endl; os << "builder=" << builder << endl;
if ( path_l > 0 && path_l < path_max ) { os << "date=" << __DATE__ << endl;
path[path_l]=0; os << "time=" << __TIME__ << endl;
os << szBuilder << "executable=" << path << std::endl; if ( libs.begin() != libs.end() ) {
} os << "executable=" << *libs.begin() << endl;
os << szBuilder << "date=\"" << __DATE__ << "\",time=" __TIME__ << std::endl; for ( string_i lib = libs.begin()+1 ; lib != libs.end() ; lib++ )
os << "library=" << *lib << endl;
} }
} }

Loading…
Cancel
Save