#include "gedcom_internal.h"
#include "gedcom.h"
#include "encoding.h"
+#include "encoding_state.h"
#include "tag_data.h"
#include "buffer.h"
#include "utf8tools.h"
#define MAXWRITELEN MAXGEDCLINELEN
-/* SYS_NEWLINE is defined in config.h */
-struct encoding_state write_encoding =
-{ "ASCII", "ASCII", ONE_BYTE, WITHOUT_BOM, SYS_NEWLINE };
-
struct Gedcom_write_struct {
int filedesc;
convert_t conv;
int ctxt_level;
};
-const char* default_encoding[] = {
- /* ONE_BYTE */ "ASCII",
- /* TWO_BYTE_HILO */ "UCS-2BE",
- /* TWO_BYTE_LOHI */ "UCS-2LE"
-};
-
-const char* terminator[] = {
- /* END_CR */ "\x0D",
- /* END_LF */ "\x0A",
- /* END_CR_LF */ "\x0D\x0A",
- /* END_LF_CR */ "\x0A\x0D"
-};
-
void cleanup_write_buffer();
struct safe_buffer write_buffer = { NULL, 0, NULL, 0, cleanup_write_buffer };
}
int write_encoding_value(Gedcom_write_hndl hndl,
- int level, char* xref, char* tag, char* value)
+ int level, const char* xref, const char* tag,
+ const char* value)
{
if (strcmp(value, write_encoding.charset))
gedcom_warning(_("Forcing HEAD.CHAR value to '%s'"),
if (line_len < value_len) {
value_ptr = value_ptr + line_len;
value_len = value_len - line_len;
- while (*value_ptr == '\n') {
+ if (*value_ptr == '\n') {
value_ptr++;
value_len--;
}
return 0;
}
-int gedcom_write_set_encoding(const char* new_charset,
- Encoding width, Enc_bom bom)
-{
- char* new_encoding = NULL;
- if (!strcmp(new_charset, "UNICODE")) {
- if (width == ONE_BYTE) {
- gedcom_error(_("Unicode cannot be encoded into one byte"));
- return 1;
- }
- else {
- new_encoding = get_encoding(new_charset, width);
- if (new_encoding) {
- write_encoding.encoding = new_encoding;
- write_encoding.width = width;
- write_encoding.bom = bom;
- strncpy(write_encoding.charset, new_charset, MAX_CHARSET_LEN);
- }
- else
- return 1;
- }
- }
- else {
- new_encoding = get_encoding(new_charset, ONE_BYTE);
- if (new_encoding) {
- write_encoding.encoding = new_encoding;
- write_encoding.width = ONE_BYTE;
- write_encoding.bom = bom;
- strncpy(write_encoding.charset, new_charset, MAX_CHARSET_LEN);
- }
- else
- return 1;
- }
- return 0;
-}
-
-int gedcom_write_set_line_terminator(Enc_line_end end)
-{
- strncpy(write_encoding.terminator, terminator[end], MAX_TERMINATOR_LEN);
- return 0;
-}
-
Gedcom_write_hndl gedcom_write_open(const char *filename)
{
Gedcom_write_hndl hndl;
if (!hndl)
MEMORY_ERROR;
else {
+ init_write_encoding();
+ init_write_terminator();
hndl->total_conv_fails = 0;
hndl->conv = initialize_utf8_conversion(write_encoding.encoding, 0);
if (!hndl->conv) {
int _gedcom_write_val(Gedcom_write_hndl hndl,
int rec_or_elt, int tag, int parent_rec_or_elt,
- char* xrefstr, char* val)
+ const char* xrefstr, const char* val)
{
int result = 1;
int level = 0;
}
int gedcom_write_record_str(Gedcom_write_hndl hndl,
- Gedcom_rec rec, char* xrefstr, char* val)
+ Gedcom_rec rec, const char* xrefstr,
+ const char* val)
{
int result = 1;
if (check_type(rec, (val ? GV_CHAR_PTR : GV_NULL)))
int gedcom_write_element_str(Gedcom_write_hndl hndl,
Gedcom_elt elt, int tag, int parent_rec_or_elt,
- char* val)
+ const char* val)
{
int result = 1;
if (check_type(elt, (val ? GV_CHAR_PTR : GV_NULL)))
int gedcom_write_element_xref(Gedcom_write_hndl hndl,
Gedcom_elt elt, int tag, int parent_rec_or_elt,
- struct xref_value* val)
+ const struct xref_value* val)
{
int result = 1;
if (check_type(elt, (val ? GV_XREF_PTR : GV_NULL)))
int gedcom_write_element_date(Gedcom_write_hndl hndl,
Gedcom_elt elt, int tag, int parent_rec_or_elt,
- struct date_value* val)
+ const struct date_value* val)
{
int result = 1;
if (check_type(elt, (val ? GV_DATE_VALUE : GV_NULL)))
int gedcom_write_element_age(Gedcom_write_hndl hndl,
Gedcom_elt elt, int tag, int parent_rec_or_elt,
- struct age_value* val)
+ const struct age_value* val)
{
int result = 1;
if (check_type(elt, (val ? GV_AGE_VALUE : GV_NULL)))
return result;
}
-int gedcom_write_user_str(Gedcom_write_hndl hndl, int level, char* tag,
- char* xrefstr, char* value)
+int gedcom_write_user_str(Gedcom_write_hndl hndl, int level, const char* tag,
+ const char* xrefstr, const char* value)
{
int result = 1;
if (tag && tag[0] == '_')
return result;
}
-int gedcom_write_user_xref(Gedcom_write_hndl hndl, int level, char* tag,
- char* xrefstr, struct xref_value* val)
+int gedcom_write_user_xref(Gedcom_write_hndl hndl, int level, const char* tag,
+ const char* xrefstr, const struct xref_value* val)
{
int result = 1;
if (tag && tag[0] == '_')