[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:43:19 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=72af64e
The following commit has been merged in the master branch:
commit 72af64ee84e6693ae8be379a7d5d3c60b2869c27
Author: Robin Mills <robin at clanmills.com>
Date: Sat Aug 18 03:10:34 2012 +0000
image file list is sorted by image date. Removed tabs in source. Fixed linux infinite file recursion directory read.
---
samples/geotag.cpp | 688 +++++++++++++++++++++++++++--------------------------
1 file changed, 355 insertions(+), 333 deletions(-)
diff --git a/samples/geotag.cpp b/samples/geotag.cpp
index 3f7b1c0..3dbdc63 100644
--- a/samples/geotag.cpp
+++ b/samples/geotag.cpp
@@ -1,4 +1,5 @@
// ***************************************************************** -*- C++ -*-
+
// geotag.cpp, $Rev: 2286 $
// Sample program to read gpx files and update the images with GPS tags
@@ -7,11 +8,14 @@
#include <iostream>
#include <iomanip>
#include <cassert>
+#include <algorithm>
#include <stdio.h>
-#include <sys/types.h>
+#include <stdlib.h>
#include <time.h>
#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include "expat.h"
@@ -31,7 +35,9 @@ using namespace std;
#ifdef _MSC_VER
#include <windows.h>
-char* realpath(const char* file,char* path);
+char* realpath(const char* file,char* path);
+#define lstat _stat
+#define stat _stat
#if _MSC_VER < 1400
#define strcpy_s(d,l,s) strcpy(d,s)
#define strcat_s(d,l,s) strcat(d,s)
@@ -39,9 +45,9 @@ char* realpath(const char* file,char* path);
#else
#include <dirent.h>
-#include <unistd.h>
+#include <unistd.h>
#include <sys/param.h>
-#define stricmp strcasecmp
+#define stricmp strcasecmp
#endif
// prototypes
@@ -57,31 +63,31 @@ int timeZoneAdjust();
#ifdef _MSC_VER
char* realpath(const char* file,char* path)
{
- char* result = (char*) malloc(_MAX_PATH);
- if (result) GetFullPathName(file,_MAX_PATH,result,NULL);
- return result ;
+ char* result = (char*) malloc(_MAX_PATH);
+ if (result) GetFullPathName(file,_MAX_PATH,result,NULL);
+ return result ;
}
#endif
// Command-line parser
class Options {
public:
- bool verbose;
- bool help;
- bool version;
- bool dst;
- bool dryrun;
-
- Options()
- {
- verbose = false;
- help = false;
- version = false;
- dst = false;
- dryrun = false;
- }
-
- virtual ~Options() {} ;
+ bool verbose;
+ bool help;
+ bool version;
+ bool dst;
+ bool dryrun;
+
+ Options()
+ {
+ verbose = false;
+ help = false;
+ version = false;
+ dst = false;
+ dryrun = false;
+ }
+
+ virtual ~Options() {} ;
} ;
enum
@@ -121,101 +127,101 @@ enum
class Position
{
public:
- Position(time_t time,double lat,double lon,double ele) : time_(time),lon_(lon),lat_(lat),ele_(ele) {};
- Position() { time_=0 ; lat_=0.0 ; lon_=0.0 ; ele_=0.0 ; };
+ Position(time_t time,double lat,double lon,double ele) : time_(time),lon_(lon),lat_(lat),ele_(ele) {};
+ Position() { time_=0 ; lat_=0.0 ; lon_=0.0 ; ele_=0.0 ; };
virtual ~Position() {} ;
// copy constructor
- Position(const Position& o) : time_(o.time_),lon_(o.lon_),lat_(o.lat_),ele_(o.ele_) {};
+ Position(const Position& o) : time_(o.time_),lon_(o.lon_),lat_(o.lat_),ele_(o.ele_) {};
// instance methods
- bool good() { return time_ || lon_ || lat_ || ele_ ; }
- std::string getTimeString() { if ( times_.empty() ) times_ = getExifTime(time_) ; return times_; }
- time_t getTime() { return time_ ; }
- std::string toString();
+ bool good() { return time_ || lon_ || lat_ || ele_ ; }
+ std::string getTimeString() { if ( times_.empty() ) times_ = getExifTime(time_) ; return times_; }
+ time_t getTime() { return time_ ; }
+ std::string toString();
// getters/setters
- double lat() {return lat_ ;}
- double lon() {return lon_ ;}
- double ele() {return ele_ ;}
- int delta() {return delta_ ;}
- void delta(int delta) {delta_=delta ;}
+ double lat() {return lat_ ;}
+ double lon() {return lon_ ;}
+ double ele() {return ele_ ;}
+ int delta() {return delta_ ;}
+ void delta(int delta) {delta_=delta ;}
// data
private:
- time_t time_;
- double lon_ ;
- double lat_ ;
- double ele_ ;
- std::string times_;
- int delta_;
+ time_t time_;
+ double lon_ ;
+ double lat_ ;
+ double ele_ ;
+ std::string times_;
+ int delta_;
// public static data
public:
- static int adjust_ ;
- static int tz_ ;
- static int dst_ ;
- static time_t deltaMax_;
+ static int adjust_ ;
+ static int tz_ ;
+ static int dst_ ;
+ static time_t deltaMax_;
// public static member functions
public:
- static int Adjust() {return Position::adjust_ + Position::tz_ + Position::dst_ ;}
- static int tz() {return tz_ ;}
- static int dst() {return dst_ ;}
- static int adjust() {return adjust_;}
-
- static std::string toExifString(double d,bool bRational,bool bLat);
- static std::string toExifString(double d);
- static std::string toExifTimeStamp(std::string& t);
+ static int Adjust() {return Position::adjust_ + Position::tz_ + Position::dst_ ;}
+ static int tz() {return tz_ ;}
+ static int dst() {return dst_ ;}
+ static int adjust() {return adjust_;}
+
+ static std::string toExifString(double d,bool bRational,bool bLat);
+ static std::string toExifString(double d);
+ static std::string toExifTimeStamp(std::string& t);
};
std::string Position::toExifTimeStamp(std::string& t)
-{
- char result[200];
- const char* arg = t.c_str();
- int HH = 0 ;
- int mm = 0 ;
- int SS = 0 ;
+{
+ char result[200];
+ const char* arg = t.c_str();
+ int HH = 0 ;
+ int mm = 0 ;
+ int SS = 0 ;
if ( strstr(arg,":") || strstr(arg,"-") ) {
- int YY,MM,DD ;
- char a,b,c,d,e ;
- sscanf(arg,"%d%c%d%c%d%c%d%c%d%c%d",&YY,&a,&MM,&b,&DD,&c,&HH,&d,&mm,&e,&SS);
- }
- sprintf(result,"%d/1 %d/1 %d/1",HH,mm,SS);
- return std::string(result);
+ int YY,MM,DD ;
+ char a,b,c,d,e ;
+ sscanf(arg,"%d%c%d%c%d%c%d%c%d%c%d",&YY,&a,&MM,&b,&DD,&c,&HH,&d,&mm,&e,&SS);
+ }
+ sprintf(result,"%d/1 %d/1 %d/1",HH,mm,SS);
+ return std::string(result);
}
std::string Position::toExifString(double d)
{
- char result[200];
- d *= 100;
- sprintf(result,"%d/100",abs((int)d));
- return std::string(result);
+ char result[200];
+ d *= 100;
+ sprintf(result,"%d/100",abs((int)d));
+ return std::string(result);
}
std::string Position::toExifString(double d,bool bRational,bool bLat)
{
- const char* NS= d>=0.0?"N":"S";
- const char* EW= d>=0.0?"E":"W";
- if ( d < 0 ) d = -d;
- int deg = (int) d;
- d -= deg;
- d *= 60;
- int min = (int) d ;
- d -= min;
- d *= 60;
- int sec = (int)d;
- char result[200];
- sprintf(result,bRational ? "%d/1 %d/1 %d/1%s" : "%03d.%02d'%02d\"%s" ,deg,min,sec,bRational?"":bLat?EW:NS);
- return std::string(result);
+ const char* NS= d>=0.0?"N":"S";
+ const char* EW= d>=0.0?"E":"W";
+ if ( d < 0 ) d = -d;
+ int deg = (int) d;
+ d -= deg;
+ d *= 60;
+ int min = (int) d ;
+ d -= min;
+ d *= 60;
+ int sec = (int)d;
+ char result[200];
+ sprintf(result,bRational ? "%d/1 %d/1 %d/1%s" : "%03d.%02d'%02d\"%s" ,deg,min,sec,bRational?"":bLat?EW:NS);
+ return std::string(result);
}
std::string Position::toString()
{
- char result[200];
- std::string sLat = Position::toExifString(lat_,false,true );
- std::string sLon = Position::toExifString(lon_,false,false);
- sprintf(result,"%s %s %-8.3f",sLon.c_str(),sLat.c_str(),ele_);
- return std::string(result);
+ char result[200];
+ std::string sLat = Position::toExifString(lat_,false,true );
+ std::string sLon = Position::toExifString(lon_,false,false);
+ sprintf(result,"%s %s %-8.3f",sLon.c_str(),sLat.c_str(),ele_);
+ return std::string(result);
}
int Position::adjust_ = 0;
@@ -235,24 +241,24 @@ strings_t gFiles;
class UserData
{
public:
- UserData(Options& options) : indent(0),count(0),nTrkpt(0),bTime(false),bEle(false),options_(options) {};
+ UserData(Options& options) : indent(0),count(0),nTrkpt(0),bTime(false),bEle(false),options_(options) {};
virtual ~UserData() {} ;
// public data members
int indent;
size_t count ;
- Position now ;
- Position prev;
+ Position now ;
+ Position prev;
int nTrkpt;
bool bTime ;
bool bEle ;
double ele;
double lat;
double lon;
- std::string xmlt;
- std::string exift;
+ std::string xmlt;
+ std::string exift;
time_t time;
- Options& options_;
+ Options& options_;
// static public data memembers
};
@@ -286,29 +292,29 @@ static void endElement(void* userData, const char* name)
if ( strcmp(name,"trkpt")==0 ) {
me->nTrkpt--;
- me->now = Position(me->time,me->lat,me->lon,me->ele) ;
+ me->now = Position(me->time,me->lat,me->lon,me->ele) ;
- if ( !me->prev.good() && me->options_.verbose ) {
- printf("trkseg %s begin ",me->now.getTimeString().c_str());
- }
+ if ( !me->prev.good() && me->options_.verbose ) {
+ printf("trkseg %s begin ",me->now.getTimeString().c_str());
+ }
- // printf("lat,lon = %f,%f ele = %f xml = %s exif = %s
",me->lat,me->lon,me->ele,me->xmlt.c_str(),me->exift.c_str());
+ // printf("lat,lon = %f,%f ele = %f xml = %s exif = %s
",me->lat,me->lon,me->ele,me->xmlt.c_str(),me->exift.c_str());
- // if we have a good previous position
- // add missed entries to timedict
- //if ( me->prev.good() && (me->now.getTime() - me->prev.getTime()) < Position::timeDiffMax ) {
- // time_t missed = me->prev.getTime() ;
- // while ( ++missed < me->now.getTime() )
- // gTimeDict[missed] = me->prev ; // Position(missed,me->lat,me->lon,me->ele) ;
- //}
+ // if we have a good previous position
+ // add missed entries to timedict
+ //if ( me->prev.good() && (me->now.getTime() - me->prev.getTime()) < Position::timeDiffMax ) {
+ // time_t missed = me->prev.getTime() ;
+ // while ( ++missed < me->now.getTime() )
+ // gTimeDict[missed] = me->prev ; // Position(missed,me->lat,me->lon,me->ele) ;
+ //}
- // remember our location and put it in gTimeDict
- gTimeDict[me->time] = me->now ;
- me->prev = me->now ;
+ // remember our location and put it in gTimeDict
+ gTimeDict[me->time] = me->now ;
+ me->prev = me->now ;
+ }
+ if ( strcmp(name,"trkseg")==0 && me->options_.verbose ) {
+ printf("%s end
",me->now.getTimeString().c_str());
}
- if ( strcmp(name,"trkseg")==0 && me->options_.verbose ) {
- printf("%s end
",me->now.getTimeString().c_str());
- }
}
void charHandler(void* userData,const char* s,int len)
@@ -325,9 +331,9 @@ void charHandler(void* userData,const char* s,int len)
buffer[len]=0;
char* b = buffer ;
while ( *b == ' ' && b < buffer+len ) b++ ;
- me->xmlt = b ;
+ me->xmlt = b ;
me->time = parseTime(me->xmlt.c_str());
- me->exift = getExifTime(me->time);
+ me->exift = getExifTime(me->time);
}
me->bTime=false;
}
@@ -378,10 +384,10 @@ time_t parseTime(const char* arg,bool bAdjust)
long tm_gmtoff; /* offset from UTC in seconds */
#endif
memset(&T,0,sizeof(T));
- T.tm_min = mm ;
+ T.tm_min = mm ;
T.tm_hour = HH ;
T.tm_sec = SS ;
- if ( bAdjust ) T.tm_sec -= Position::Adjust();
+ if ( bAdjust ) T.tm_sec -= Position::Adjust();
T.tm_year = YY -1900 ;
T.tm_mon = MM -1 ;
T.tm_mday = DD ;
@@ -410,33 +416,33 @@ int timeZoneAdjust()
#endif
#if 0
- // debugging code
- struct tm utc = *gmtime(&now);
- printf("utc : offset = %6d dst = %d time = %s", 0 ,utc .tm_isdst, asctime(&utc ));
- printf("local: offset = %6d dst = %d time = %s", offset,local.tm_isdst, asctime(&local));
- printf("timeZoneAdjust = %6d
",offset);
+ // debugging code
+ struct tm utc = *gmtime(&now);
+ printf("utc : offset = %6d dst = %d time = %s", 0 ,utc .tm_isdst, asctime(&utc ));
+ printf("local: offset = %6d dst = %d time = %s", offset,local.tm_isdst, asctime(&local));
+ printf("timeZoneAdjust = %6d
",offset);
#endif
return offset ;
}
string getExifTime(const time_t t)
{
- static char result[100];
- strftime(result,sizeof(result),"%Y-%m-%d %H:%M:%S",localtime(&t));
- return result ;
+ static char result[100];
+ strftime(result,sizeof(result),"%Y-%m-%d %H:%M:%S",localtime(&t));
+ return result ;
}
std::string makePath(std::string dir,std::string file)
{
- return dir + std::string(EXV_SEPERATOR_STR) + file ;
+ return dir + std::string(EXV_SEPERATOR_STR) + file ;
}
const char* makePath(const char* dir,const char* file)
{
- static char result[_MAX_PATH] ;
- std::string r = makePath(std::string(dir),std::string(file));
- strcpy(result,r.c_str());
- return result;
+ static char result[_MAX_PATH] ;
+ std::string r = makePath(std::string(dir),std::string(file));
+ strcpy(result,r.c_str());
+ return result;
}
// file utilities
@@ -468,10 +474,10 @@ bool readDir(const char* path,Options& options)
}
else
{
- std::string pathName = makePath(path,std::string(ffd.cFileName));
- if ( getFileType(pathName,options) == typeImage ) {
- gFiles.push_back( pathName );
- }
+ std::string pathName = makePath(path,std::string(ffd.cFileName));
+ if ( getFileType(pathName,options) == typeImage ) {
+ gFiles.push_back( pathName );
+ }
}
bGo = FindNextFile(hFind, &ffd) != 0;
}
@@ -488,10 +494,16 @@ bool readDir(const char* path,Options& options)
// print all the files and directories within directory
while ((ent = readdir (dir)) != NULL)
{
- std::string pathName = makePath(path,ent->d_name);
- if ( getFileType(pathName,options) == typeImage ) {
- gFiles.push_back( pathName );
- }
+ std::string pathName = makePath(path,ent->d_name);
+ struct stat buf ;
+ lstat(path, &buf );
+ if ( ent->d_name[0] != '.' ) {
+
+ // printf("reading %s => %s
",ent->d_name,pathName.c_str());
+ if ( getFileType(pathName,options) == typeImage ) {
+ gFiles.push_back( pathName );
+ }
+ }
}
closedir (dir);
}
@@ -501,9 +513,9 @@ bool readDir(const char* path,Options& options)
inline size_t sip(FILE* f,char* buffer,size_t max_len,size_t len)
{
- while ( !feof(f) && len < max_len && buffer[len-1] != '>')
- buffer[len++] = fgetc(f);
- return len;
+ while ( !feof(f) && len < max_len && buffer[len-1] != '>')
+ buffer[len++] = fgetc(f);
+ return len;
}
bool readXML(const char* path,Options& options)
@@ -526,14 +538,14 @@ bool readXML(const char* path,Options& options)
// swallow it
if ( bResult ) {
- len = sip(f,buffer,sizeof buffer,len);
+ len = sip(f,buffer,sizeof buffer,len);
bResult = XML_Parse(parser, buffer,(int)len, len == 0 ) == XML_STATUS_OK;
}
// drink the rest of the file
while ( bResult && len != 0 ) {
len = fread(buffer,1,sizeof(buffer)-100,f);
- len = sip(f,buffer,sizeof buffer,len);
+ len = sip(f,buffer,sizeof buffer,len);
bResult = XML_Parse(parser, buffer,(int)len, len == 0 ) == XML_STATUS_OK;
};
}
@@ -560,7 +572,7 @@ bool readImage(const char* path,Options& /* options */)
return bResult ;
}
-time_t readImageTime(const char* path,std::string* pS=NULL)
+time_t readImageTime(std::string path,std::string* pS=NULL)
{
using namespace Exiv2;
@@ -581,8 +593,8 @@ time_t readImageTime(const char* path,std::string* pS=NULL)
image->readMetadata();
ExifData &exifData = image->exifData();
// printf("%s => %s
",(ds-1), exifData[ds-1].toString().c_str());
- result = parseTime(exifData[ds-1].toString().c_str(),true);
- if ( result && pS ) *pS = exifData[ds-1].toString();
+ result = parseTime(exifData[ds-1].toString().c_str(),true);
+ if ( result && pS ) *pS = exifData[ds-1].toString();
}
} catch ( ... ) {};
}
@@ -591,16 +603,16 @@ time_t readImageTime(const char* path,std::string* pS=NULL)
bool sina(const char* s,const char** a)
{
- bool bResult = false ;
- int i = 0 ;
- while ( *s == '-' ) s++;
- while ( !bResult && a[i]) {
- const char* A = a[i] ;
- while ( *A == '-' ) A++ ;
- bResult = stricmp(s,A)==0;
- i++;
- }
- return bResult;
+ bool bResult = false ;
+ int i = 0 ;
+ while ( *s == '-' ) s++;
+ while ( !bResult && a[i]) {
+ const char* A = a[i] ;
+ while ( *A == '-' ) A++ ;
+ bResult = stricmp(s,A)==0;
+ i++;
+ }
+ return bResult;
}
int readFile(const char* path,Options /* options */)
@@ -608,13 +620,13 @@ int readFile(const char* path,Options /* options */)
FILE* f = fopen(path,"r");
int nResult = f ? typeFile : typeUnknown;
if ( f ) {
- const char* docs[] = { ".doc",".txt", nil };
- const char* code[] = { ".cpp",".h" ,".pl" ,".py" ,".pyc", nil };
- const char* ext = strstr(path,".");
- if ( ext ) {
- if ( sina(ext,docs) ) nResult = typeDoc;
- if ( sina(ext,code) ) nResult = typeCode;
- }
+ const char* docs[] = { ".doc",".txt", nil };
+ const char* code[] = { ".cpp",".h" ,".pl" ,".py" ,".pyc", nil };
+ const char* ext = strstr(path,".");
+ if ( ext ) {
+ if ( sina(ext,docs) ) nResult = typeDoc;
+ if ( sina(ext,code) ) nResult = typeCode;
+ }
}
if ( f ) fclose(f) ;
@@ -623,17 +635,17 @@ int readFile(const char* path,Options /* options */)
Position* searchTimeDict(TimeDict_t& td, const time_t& time,long long delta)
{
- Position* result = NULL;
- for ( int t = 0 ; !result && t < delta ; t++ ) {
- for ( int x = 0 ; !result && x < 2 ; x++ ) {
- int T = t * ((x==0)?-1:1);
- if ( td.count(time+T) ) {
- result = &td[time+T];
- result->delta(T);
- }
- }
- }
- return result;
+ Position* result = NULL;
+ for ( int t = 0 ; !result && t < delta ; t++ ) {
+ for ( int x = 0 ; !result && x < 2 ; x++ ) {
+ int T = t * ((x==0)?-1:1);
+ if ( td.count(time+T) ) {
+ result = &td[time+T];
+ result->delta(T);
+ }
+ }
+ }
+ return result;
}
int getFileType(std::string& path,Options& options) { return getFileType(path.c_str(),options); }
@@ -648,209 +660,219 @@ int getFileType(const char* path,Options& options)
int version(const char* program)
{
- printf("%s: %s %s
",program,__DATE__,__TIME__);
- return 0;
+ printf("%s: %s %s
",program,__DATE__,__TIME__);
+ return 0;
}
int help(const char* program,char const* words[],int nWords,bool /*bVerbose*/)
{
- printf("usage: %s ",program);
- for ( int i = 0 ; i < nWords ; i++ ) {
- if ( words[i] )
- printf("%c-%s%s",i?'|':'{',words[i],i>(-kwNOVALUE)?" value":"");
- }
- printf("} path+
");
- return 0;
+ printf("usage: %s ",program);
+ for ( int i = 0 ; i < nWords ; i++ ) {
+ if ( words[i] )
+ printf("%c-%s%s",i?'|':'{',words[i],i>(-kwNOVALUE)?" value":"");
+ }
+ printf("} path+
");
+ return 0;
}
int compare(const char* a,const char* b)
{
- int result=*a && *b;
- while ( result && *a && *b) {
- char A=*a++;
- char B=*b++;
- result=tolower(A)==tolower(B);
- }
- return result;
+ int result=*a && *b;
+ while ( result && *a && *b) {
+ char A=*a++;
+ char B=*b++;
+ result=tolower(A)==tolower(B);
+ }
+ return result;
}
int find(const char* arg,char const* words[],int nWords)
{
- int result=0;
+ if ( arg[0] != '-' ) return kwSYNTAX;
+
+ int result=0;
int count =0;
- for ( int i = 0 ; i < nWords ; i++) {
- int j = 0 ;
- while ( arg[j] == '-' ) j++;
- if ( ::compare(arg+j,words[i]) ) {
- result = i ;
- count++;
- }
- }
+ for ( int i = 0 ; i < nWords ; i++) {
+ int j = 0 ;
+ while ( arg[j] == '-' ) j++;
+ if ( ::compare(arg+j,words[i]) ) {
+ result = i ;
+ count++;
+ }
+ }
- return count==1?result:kwSYNTAX;
+ return count==1?result:kwSYNTAX;
}
int parseTZ(const char* adjust)
{
- int h=0;
- int m=0;
- char c ;
- try {
- sscanf(adjust,"%d%c%d",&h,&c,&m);
- } catch ( ... ) {} ;
-
- return (3600*h)+(60*m);
+ int h=0;
+ int m=0;
+ char c ;
+ try {
+ sscanf(adjust,"%d%c%d",&h,&c,&m);
+ } catch ( ... ) {} ;
+
+ return (3600*h)+(60*m);
+}
+
+bool mySort(std::string a,std::string b)
+{
+ time_t A = readImageTime(a);
+ time_t B = readImageTime(b);
+ return (A<B);
}
int main(int argc,const char* argv[])
{
- int result=0;
- const char* program = argv[0];
+ int result=0;
+ const char* program = argv[0];
- const char* types[typeMax];
+ const char* types[typeMax];
types[typeUnknown ] = "unknown";
types[typeDirectory] = "directory";
types[typeImage ] = "image";
types[typeXML ] = "xml";
- types[typeDoc ] = "doc";
- types[typeCode ] = "code";
+ types[typeDoc ] = "doc";
+ types[typeCode ] = "code";
types[typeFile ] = "file";
- char const* keywords[kwMAX];
- memset(keywords,0,sizeof(keywords));
- keywords[kwHELP ] = "help";
- keywords[kwVERSION ] = "version";
- keywords[kwVERBOSE ] = "verbose";
- keywords[kwDRYRUN ] = "dryrun";
- keywords[kwDST ] = "dst";
- keywords[kwADJUST ] = "adjust";
- keywords[kwTZ ] = "tz";
- keywords[kwDELTA ] = "delta";
-
- map<std::string,string> shorts;
- shorts["-?"] = "-help";
- shorts["-h"] = "-help";
- shorts["-v"] = "-verbose";
- shorts["-V"] = "-version";
- shorts["-d"] = "-dst";
- shorts["-a"] = "-adjust";
- shorts["-t"] = "-tz";
- shorts["-D"] = "-delta";
- shorts["-s"] = "-delta";
- shorts["-X"] = "-dryrun";
+ char const* keywords[kwMAX];
+ memset(keywords,0,sizeof(keywords));
+ keywords[kwHELP ] = "help";
+ keywords[kwVERSION ] = "version";
+ keywords[kwVERBOSE ] = "verbose";
+ keywords[kwDRYRUN ] = "dryrun";
+ keywords[kwDST ] = "dst";
+ keywords[kwADJUST ] = "adjust";
+ keywords[kwTZ ] = "tz";
+ keywords[kwDELTA ] = "delta";
+
+ map<std::string,string> shorts;
+ shorts["-?"] = "-help";
+ shorts["-h"] = "-help";
+ shorts["-v"] = "-verbose";
+ shorts["-V"] = "-version";
+ shorts["-d"] = "-dst";
+ shorts["-a"] = "-adjust";
+ shorts["-t"] = "-tz";
+ shorts["-D"] = "-delta";
+ shorts["-s"] = "-delta";
+ shorts["-X"] = "-dryrun";
Options options ;
- options.help = sina(keywords[kwHELP ],argv) || argc < 2;
- options.verbose = sina(keywords[kwVERBOSE],argv);
- options.dryrun = sina(keywords[kwDRYRUN ],argv);
- options.version = sina(keywords[kwVERSION],argv);
- options.dst = sina(keywords[kwDST ],argv);
- options.dryrun = sina(keywords[kwDRYRUN ],argv);
+ options.help = sina(keywords[kwHELP ],argv) || argc < 2;
+ options.verbose = sina(keywords[kwVERBOSE],argv);
+ options.dryrun = sina(keywords[kwDRYRUN ],argv);
+ options.version = sina(keywords[kwVERSION],argv);
+ options.dst = sina(keywords[kwDST ],argv);
+ options.dryrun = sina(keywords[kwDRYRUN ],argv);
for ( int i = 1 ; !result && i < argc ; i++ ) {
const char* arg = argv[i++];
- if ( shorts.count(arg) ) arg = shorts[arg].c_str();
+ if ( shorts.count(arg) ) arg = shorts[arg].c_str();
- const char* value = argv[i ];
- int ivalue = ::atoi(value?value:"0");
- int key = ::find(arg,keywords,kwMAX);
+ const char* value = argv[i ];
+ int ivalue = ::atoi(value?value:"0");
+ int key = ::find(arg,keywords,kwMAX);
int needv = key < kwMAX && key > (-kwNOVALUE);
if (!needv ) i--;
if ( needv && !value) key = kwNEEDVALUE;
switch ( key ) {
- case kwDST : options.dst = true ; break ;
- case kwHELP : options.help = true ; break ;
- case kwVERSION : options.version = true ; break;
- case kwDRYRUN : options.dryrun = true ; break ;
- case kwVERBOSE : options.verbose = true ; break;
- case kwTZ : Position::tz_ = parseTZ(value);break;
- case kwADJUST : Position::adjust_ = ivalue;break;
- case kwDELTA : Position::deltaMax_= ivalue;break;
+ case kwDST : options.dst = true ; break;
+ case kwHELP : options.help = true ; break;
+ case kwVERSION : options.version = true ; break;
+ case kwDRYRUN : options.dryrun = true ; break;
+ case kwVERBOSE : options.verbose = true ; break;
+ case kwTZ : Position::tz_ = parseTZ(value);break;
+ case kwADJUST : Position::adjust_ = ivalue;break;
+ case kwDELTA : Position::deltaMax_= ivalue;break;
case kwNEEDVALUE: fprintf(stderr,"error: %s requires a value
",arg); result = resultSyntaxError ; break ;
- case kwSYNTAX : default:
- {
- int type = getFileType(arg,options) ;
- if ( options.verbose ) printf("%s %s ",arg,types[type]) ;
- if ( type == typeImage ) {
- time_t t = readImageTime(arg) ;
- char* path = realpath(arg,NULL);
- if ( t && path ) {
- if ( options.verbose) printf("%s %ld %s",path,(long int)t,asctime(localtime(&t)));
- gFiles.push_back(path);
- }
- if ( path ) :: free((void*) path);
- }
- if ( type == typeUnknown ) {
- fprintf(stderr,"error: illegal syntax %s
",arg);
- result = resultSyntaxError ;
- }
- if ( options.verbose ) printf("
") ;
- }break;
- }
- }
-
- if ( options.help ) ::help(program,keywords,kwMAX,options.verbose);
- if ( options.version ) ::version(program);
-
- if ( !result ) {
- if ( options.dst ) Position::dst_ = 3600;
- if ( options.verbose ) {
- int t = Position::tz();
- int d = Position::dst();
- int a = Position::adjust();
- int A = Position::Adjust();
- int s = A ;
- int h = s/3600;
- s-= h*3600;
- s = abs(s);
- int m = s/60 ;
- s-= m*60 ;
- printf("tz,dsl,adjust = %d,%d,%d total = %dsecs (= %d:%d:%d)
",t,d,a,A,h,m,s);
- }
- for ( size_t p = 0 ; !options.dryrun && p < gFiles.size() ; p++ ) {
- const char* arg = gFiles[p].c_str() ;
- std::string stamp ;
- time_t t = readImageTime(arg,&stamp) ;
- Position* pPos = searchTimeDict(gTimeDict,t,Position::deltaMax_);
- if ( pPos ) {
- try {
- Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(gFiles[p]);
- if ( image.get() ) {
- image->readMetadata();
- Exiv2::ExifData &exifData = image->exifData();
-
- // delete exifData["Exif.GPSInfo.GPSProcessingMethod" ];
- exifData.erase(exifData.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSProcessingMethod")));
- exifData.erase(exifData.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitudeRef")));
- exifData.erase(exifData.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSVersionID")));
-
- exifData["Exif.GPSInfo.GPSProcessingMethod" ] = "65 83 67 73 73 0 0 0 72 89 66 82 73 68 45 70 73 88"; // ASCII HYBRID-FIX
- exifData["Exif.GPSInfo.GPSVersionID" ] = "2 2 0 0";
- exifData["Exif.GPSInfo.GPSMapDatum" ] = "WGS-84";
-
- exifData["Exif.GPSInfo.GPSLatitude" ] = Position::toExifString(pPos->lat(),true,true);
- exifData["Exif.GPSInfo.GPSLongitude" ] = Position::toExifString(pPos->lon(),true,false);
- exifData["Exif.GPSInfo.GPSAltitude" ] = Position::toExifString(pPos->ele());
-
- exifData["Exif.GPSInfo.GPSAltitudeRef" ] = pPos->ele()<0.0?"1":"0";
- exifData["Exif.GPSInfo.GPSLatitudeRef" ] = std::string(pPos->lat()>0?"E":"W");
- exifData["Exif.GPSInfo.GPSLongitudeRef" ] = std::string(pPos->lat()>0?"S":"N");
-
- exifData["Exif.GPSInfo.GPSDateStamp" ] = stamp;
- exifData["Exif.GPSInfo.GPSTimeStamp" ] = Position::toExifTimeStamp(stamp);
-
- image->writeMetadata();
- }
- } catch ( ... ) {};
- printf("%s %s % 2d
",arg,pPos->toString().c_str(),pPos->delta());
- } else {
- printf("%s *** not in time dict ***
",arg);
- }
- }
- }
+ case kwSYNTAX : default:
+ {
+ int type = getFileType(arg,options) ;
+ if ( options.verbose ) printf("%s %s ",arg,types[type]) ;
+ if ( type == typeImage ) {
+ time_t t = readImageTime(std::string(arg)) ;
+ char* path = realpath(arg,NULL);
+ if ( t && path ) {
+ if ( options.verbose) printf("%s %ld %s",path,(long int)t,asctime(localtime(&t)));
+ gFiles.push_back(path);
+ }
+ if ( path ) :: free((void*) path);
+ }
+ if ( type == typeUnknown ) {
+ fprintf(stderr,"error: illegal syntax %s
",arg);
+ result = resultSyntaxError ;
+ }
+ if ( options.verbose ) printf("
") ;
+ }break;
+ }
+ }
+
+ if ( options.help ) ::help(program,keywords,kwMAX,options.verbose);
+ if ( options.version ) ::version(program);
+
+ if ( !result ) {
+ sort(gFiles.begin(),gFiles.end(),mySort);
+ if ( options.dst ) Position::dst_ = 3600;
+ if ( options.verbose ) {
+ int t = Position::tz();
+ int d = Position::dst();
+ int a = Position::adjust();
+ int A = Position::Adjust();
+ int s = A ;
+ int h = s/3600;
+ s-= h*3600;
+ s = abs(s);
+ int m = s/60 ;
+ s-= m*60 ;
+ printf("tz,dsl,adjust = %d,%d,%d total = %dsecs (= %d:%d:%d)
",t,d,a,A,h,m,s);
+ }
+ for ( size_t p = 0 ; !options.dryrun && p < gFiles.size() ; p++ ) {
+ std::string arg = gFiles[p] ;
+ std::string stamp ;
+ time_t t = readImageTime(arg,&stamp) ;
+ Position* pPos = searchTimeDict(gTimeDict,t,Position::deltaMax_);
+ if ( pPos ) {
+ try {
+ Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(gFiles[p]);
+ if ( image.get() ) {
+ image->readMetadata();
+ Exiv2::ExifData &exifData = image->exifData();
+
+ // delete exifData["Exif.GPSInfo.GPSProcessingMethod" ];
+ exifData.erase(exifData.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSProcessingMethod")));
+ exifData.erase(exifData.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitudeRef")));
+ exifData.erase(exifData.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSVersionID")));
+
+ exifData["Exif.GPSInfo.GPSProcessingMethod" ] = "65 83 67 73 73 0 0 0 72 89 66 82 73 68 45 70 73 88"; // ASCII HYBRID-FIX
+ exifData["Exif.GPSInfo.GPSVersionID" ] = "2 2 0 0";
+ exifData["Exif.GPSInfo.GPSMapDatum" ] = "WGS-84";
+
+ exifData["Exif.GPSInfo.GPSLatitude" ] = Position::toExifString(pPos->lat(),true,true);
+ exifData["Exif.GPSInfo.GPSLongitude" ] = Position::toExifString(pPos->lon(),true,false);
+ exifData["Exif.GPSInfo.GPSAltitude" ] = Position::toExifString(pPos->ele());
+
+ exifData["Exif.GPSInfo.GPSAltitudeRef" ] = pPos->ele()<0.0?"1":"0";
+ exifData["Exif.GPSInfo.GPSLatitudeRef" ] = std::string(pPos->lat()>0?"E":"W");
+ exifData["Exif.GPSInfo.GPSLongitudeRef" ] = std::string(pPos->lat()>0?"S":"N");
+
+ exifData["Exif.GPSInfo.GPSDateStamp" ] = stamp;
+ exifData["Exif.GPSInfo.GPSTimeStamp" ] = Position::toExifTimeStamp(stamp);
+
+ image->writeMetadata();
+ }
+ } catch ( ... ) {};
+ printf("%s %s % 2d
",arg.c_str(),pPos->toString().c_str(),pPos->delta());
+ } else {
+ printf("%s *** not in time dict ***
",arg.c_str());
+ }
+ }
+ }
return result ;
-}
+}
\ No newline at end of file
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list