import libexif import tables var buf {.threadvar.}: cstring # MUST be called once per thread if any of the helper procs are used proc init_exif*() = buf = cast[cstring](alloc(2001)) proc deinit_exif*() = dealloc(buf) proc collect_exif_data*(ed: ptr ExifData): Table[string, string] {.gcsafe.} = proc process_entries(entry: ptr ExifEntry , callback_data: pointer) {.cdecl.} = let name = exif_tag_get_name(entry.tag) let val = exif_entry_get_value(entry, buf, 2000) let result_table = cast[ptr Table[string, string]](callback_data) result_table[][$name] = $val proc process_contents(content: ptr ExifContent, callback_data: pointer) {.cdecl.} = exif_content_foreach_entry(content, process_entries, callback_data) exif_data_foreach_content(ed, process_contents, addr result) exif_data_unref(ed)