+ NMEM_LEAVE;
+}
+
+void nmem_transfer (NMEM dst, NMEM src)
+{
+ nmem_block *t;
+ while ((t=src->blocks))
+ {
+ src->blocks = t->next;
+ t->next = dst->blocks;
+ dst->blocks = t;
+ }
+ dst->total += src->total;
+ src->total = 0;
+}
+
+void nmem_critical_enter (void)
+{
+ NMEM_ENTER;
+}
+
+void nmem_critical_leave (void)
+{
+ NMEM_LEAVE;
+}
+
+void nmem_init (void)
+{
+ if (++nmem_init_flag == 1)
+ {
+#ifdef WIN32
+ InitializeCriticalSection(&critical_section);
+#elif YAZ_GNU_THREADS
+ yaz_log (LOG_LOG, "pth_init");
+ pth_init ();
+#endif
+ nmem_active_no = 0;
+ freelist = NULL;
+ cfreelist = NULL;
+ }
+}
+
+void nmem_exit (void)
+{
+ if (--nmem_init_flag == 0)
+ {
+ oid_exit();
+ while (freelist)
+ {
+ struct nmem_block *fl = freelist;
+ freelist = freelist->next;
+ xfree (fl->buf);
+ xfree (fl);
+ }
+ while (cfreelist)
+ {
+ struct nmem_control *cfl = cfreelist;
+ cfreelist = cfreelist->next;
+ xfree (cfl);
+ }
+#ifdef WIN32
+ DeleteCriticalSection(&critical_section);
+#endif
+ }
+}
+
+
+#ifdef WIN32
+BOOL WINAPI DllMain (HINSTANCE hinstDLL,
+ DWORD reason,
+ LPVOID reserved)
+{
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ nmem_init ();
+ break;
+ case DLL_PROCESS_DETACH:
+ nmem_exit ();
+ }
+ return TRUE;
+}
+#endif
+
+int yaz_errno(void)
+{
+ return errno;
+}
+
+void yaz_set_errno(int v)
+{
+ errno = v;
+}
+
+void yaz_strerror(char *buf, int max)
+{
+ char *cp;
+#ifdef WIN32
+ DWORD err = GetLastError();
+ if (err)
+ {
+ FormatMessage(
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ err,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default lang */
+ (LPTSTR) buf,
+ max-1,
+ NULL);
+ }
+ else
+ *buf = '\0';
+#else
+/* UNIX */
+#if HAVE_STRERROR_R
+#if YAZ_POSIX_THREADS
+ *buf = '\0';
+ strerror_r(errno, buf, max);
+ /* if buffer is unset - use strerror anyway (GLIBC bug) */
+ if (*buf == '\0')
+ strcpy(buf, strerror(yaz_errno()));
+#else
+ strcpy(buf, strerror(yaz_errno()));
+#endif
+#else
+ strcpy(buf, strerror(yaz_errno()));
+#endif
+/* UNIX */
+#endif
+ if ((cp=strrchr(buf, '\n')))
+ *cp = '\0';
+ if ((cp=strrchr(buf, '\r')))
+ *cp = '\0';