#include"define.h" #include #include"cinterface.h" #include #include #include #include void free_all(void* str) { delete str; } void freewstringlist(wchar_t** strlist, int num) { for (int i = 0; i < num; i++) { delete strlist[i]; } delete strlist; } void freestringlist(char** strlist, int num) { for (int i = 0; i < num; i++) { delete strlist[i]; } delete strlist; } int* vecint2c(std::vector& vs) { int* argv = new int [vs.size() + 1]; for (size_t i = 0; i < vs.size(); i++) { argv[i] = vs[i]; } return argv; } char** vecstr2c(std::vector& vs) { char** argv = new char* [vs.size() + 1]; for (size_t i = 0; i < vs.size(); i++) { argv[i] = new char[vs[i].size() + 1]; strcpy_s(argv[i], vs[i].size()+1, vs[i].c_str()); argv[i][vs[i].size()] = 0; } return argv; } wchar_t** vecwstr2c(std::vector& vs) { wchar_t** argv = new wchar_t* [vs.size() + 1]; for (size_t i = 0; i < vs.size(); i++) { argv[i] = new wchar_t[vs[i].size() + 1]; wcscpy_s(argv[i], vs[i].size()+1, vs[i].c_str()); argv[i][vs[i].size()] = 0; } return argv; } struct MemoryStruct { char *memory; size_t size; }; size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp){ size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)userp; char *ptr; if(mem->memory) ptr=(char*)realloc(mem->memory, mem->size + realsize + 1); else ptr=(char*)malloc( mem->size + realsize + 1); if(!ptr) { /* out of memory! */ printf("not enough memory (realloc returned NULL)\n"); return 0; } mem->memory = ptr; memcpy(&(mem->memory[mem->size]), contents, realsize); mem->size += realsize; mem->memory[mem->size] = 0; return realsize; } void c_free(void* ptr){ free(ptr); } class lockedqueue{ std::mutex lock; std::queuedata; HANDLE hsema; public: lockedqueue(){ hsema=CreateSemaphore(NULL,0,65535,NULL); } ~lockedqueue(){ CloseHandle(hsema); } void push(std::string&& _){ std::lock_guard _l(lock); data.push(std::move(_)); ReleaseSemaphore(hsema,1,NULL); } std::string pop(){ WaitForSingleObject(hsema,INFINITE); std::lock_guard _l(lock); auto _=data.front(); data.pop(); return _; } bool empty(){ std::lock_guard _l(lock); return data.empty(); } }; void* lockedqueuecreate(){ return new lockedqueue(); } void lockedqueuefree(void* q){ delete reinterpret_cast(q); } void* lockedqueueget(void* q,size_t* l){ auto data=reinterpret_cast(q)->pop(); auto datastatic=new char[data.size()]; memcpy(datastatic,data.data(),data.size()); *l=data.size(); return datastatic; } void lockedqueuepush(void* q,size_t l,void*ptr){ reinterpret_cast(q)->push(std::string((char*)ptr,l)); } bool lockedqueueempty(void* q){ return reinterpret_cast(q)->empty(); } size_t WriteMemoryToQueue(void *contents, size_t size, size_t nmemb, void *userp){ size_t realsize = size * nmemb; auto queue=reinterpret_cast(userp); queue->push(std::string((char*)contents,realsize)); return realsize; }