Compare commits
5 Commits
Author | SHA1 | Date |
---|---|---|
Michael Uleysky | 03ce0ef46c | 9 years ago |
Michael Uleysky | 0e5245e901 | 9 years ago |
Michael Uleysky | c4fe370b1c | 9 years ago |
Michael Uleysky | c62fccd415 | 9 years ago |
Michael Uleysky | a363891b01 | 9 years ago |
2 changed files with 131 additions and 0 deletions
@ -0,0 +1,32 @@
|
||||
SHELL=/bin/bash
|
||||
OPTFLAGS=-O2 -flto -g
|
||||
EXPORTFLAGS=-fvisibility=hidden -fpic -Wl,--export-dynamic
|
||||
CPPFLAGS=-std=gnu++11 -I../include -I/home/michael/tmp/gmt5/include/gmt
|
||||
LIBSFLAGS=-L/home/michael/tmp/gmt5/lib64 -Wl,-rpath /home/michael/tmp/gmt5/lib64 -lgmt -ldl -lpthread $(MODLIBS)
|
||||
WARNFLAGS=-Wall
|
||||
|
||||
CFLAGS=$(OPTFLAGS) $(EXPORTFLAGS) $(WARNFLAGS) $(CPPFLAGS)
|
||||
LDFLAGS=$(OPTFLAGS) $(EXPORTFLAGS) $(WARNFLAGS) $(LIBSFLAGS)
|
||||
|
||||
CC=g++
|
||||
|
||||
SOURCE = $(wildcard *.cpp)
|
||||
DEPENDS = $(subst .cpp,.d,$(SOURCE))
|
||||
OBJECTS = $(subst .cpp,.o,$(SOURCE))
|
||||
|
||||
gmttest: $(OBJECTS) $(MODOBJECTS) |
||||
$(CC) -o $@ $(OBJECTS) $(MODOBJECTS) $(LDFLAGS)
|
||||
|
||||
include $(DEPENDS) |
||||
|
||||
%.o: %.cpp |
||||
$(CC) -c $(CFLAGS) -o $@ $<
|
||||
|
||||
%.d: %.cpp |
||||
$(CC) $(CPPFLAGS) -MM -MT $(subst .cpp,.o,$<) $< | sed 's%\(^.*\):%\1 $@ :%g' >$@
|
||||
|
||||
clean: |
||||
rm -f *.o *.d
|
||||
|
||||
distclean: clean |
||||
rm -f gmttest
|
@ -0,0 +1,99 @@
|
||||
#include <gmt.h> |
||||
#include <iostream> |
||||
#include <string> |
||||
#include <unistd.h> |
||||
#include <sys/wait.h> |
||||
|
||||
int print_func(FILE* fd, const char* str) |
||||
{ |
||||
std::cout<<"PRINT: "<<str<<std::endl; |
||||
return 0; |
||||
} |
||||
|
||||
struct gmtworkthreadpars |
||||
{ |
||||
void* api; |
||||
const char* module; |
||||
struct GMT_OPTION* opts; |
||||
int fd; |
||||
int ret; |
||||
}; |
||||
|
||||
void gmtonexithandler(int ret, void* x) |
||||
{ |
||||
reinterpret_cast<struct gmtworkthreadpars*>(x)->ret=ret; |
||||
close(reinterpret_cast<struct gmtworkthreadpars*>(x)->fd); |
||||
pthread_exit(&(reinterpret_cast<struct gmtworkthreadpars*>(x)->ret)); |
||||
} |
||||
|
||||
void* gmtworkthread(void* x) |
||||
{ |
||||
struct gmtworkthreadpars* p=reinterpret_cast<struct gmtworkthreadpars*>(x); |
||||
on_exit(gmtonexithandler,x); |
||||
GMT_Append_Option(p->api,GMT_Make_Option(p->api,'>',const_cast<char*>(("/dev/fd/"+std::to_string(p->fd)).c_str())),p->opts); |
||||
p->ret=GMT_Call_Module(p->api,p->module,GMT_MODULE_OPT,p->opts); |
||||
exit(p->ret); |
||||
return 0; |
||||
} |
||||
|
||||
int callgmtmodule(void *api, const char *module, struct GMT_OPTION *opts, std::string& res) |
||||
{ |
||||
int pipefd[2]; |
||||
ssize_t br; |
||||
char buffer[4096]; |
||||
pthread_t wthr; |
||||
struct gmtworkthreadpars p; |
||||
int *pret; |
||||
|
||||
pipe(pipefd); |
||||
p.api=api; |
||||
p.module=module; |
||||
p.opts=opts; |
||||
p.fd=pipefd[1]; |
||||
|
||||
pthread_create(&wthr,0,&gmtworkthread,&p); |
||||
|
||||
res.erase(); |
||||
//read(pipefd[0],buffer,1);
|
||||
//close(pipefd[1]);
|
||||
do |
||||
{ |
||||
br=read(pipefd[0],buffer,4096); |
||||
std::cout<<res.length()<<" "<<br<<std::endl; |
||||
res.append(buffer,br); |
||||
} while(0!=br); |
||||
close(pipefd[0]); |
||||
res.shrink_to_fit(); |
||||
pthread_join(wthr,reinterpret_cast<void**>(&pret)); |
||||
|
||||
return *pret; |
||||
} |
||||
|
||||
|
||||
int main() |
||||
{ |
||||
char* text="GMT"; |
||||
//void* out;
|
||||
void* gmtapi; |
||||
std::string args="-R130/160/40/60 -JM12c -Xa2c -Ya2c -B5/5/swNE --GMT_HISTORY=f --FONT_ANNOT_PRIMARY=14p,Times-Bold,red"; |
||||
struct GMT_OPTION* opts; |
||||
int io,ret; |
||||
char fname[16]; |
||||
std::string out; |
||||
|
||||
gmtapi=GMT_Create_Session(text,2,3,print_func); |
||||
io=GMT_Register_IO(gmtapi,GMT_IS_TEXTSET,GMT_IS_DUPLICATE,GMT_IS_NONE,GMT_OUT,0,0); |
||||
GMT_Encode_ID(gmtapi,fname,io); |
||||
opts=GMT_Create_Options(gmtapi,0,(void*)args.c_str()); |
||||
//ret=GMT_Init_IO(gmtapi,GMT_IS_TEXTSET,GMT_IS_NONE,GMT_OUT,5,0,opts);
|
||||
std::cout<<io<<" "<<GMT_NOTSET<<" "<<fname<<" "<<ret<<std::endl; |
||||
|
||||
ret=callgmtmodule(gmtapi,"psbasemap",opts,out); |
||||
std::cout<<"Return value: "<<ret<<std::endl; |
||||
std::cout<<out.max_size()<<" "<<out.capacity()<<" "<<out.size()<<std::endl; |
||||
|
||||
GMT_Destroy_Options(gmtapi,&opts); |
||||
GMT_Destroy_Session(gmtapi); |
||||
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue