naev 0.12.6
dev_diff.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
9
10#include "dev_diff.h"
11
12#include "array.h"
13#include "nxml.h"
14
15int ddiff_save( UniHunk_t *diffs, const char *filename )
16{
17 xmlDocPtr doc;
18 xmlTextWriterPtr writer;
19 int ret = 0;
20 UniHunkTarget_t target = {
21 .type = HUNK_TARGET_NONE,
22 };
23
24 /* Create the writer. */
25 writer = xmlNewTextWriterDoc( &doc, 0 );
26 if ( writer == NULL ) {
27 WARN( _( "testXmlwriterDoc: Error creating the xml writer" ) );
28 return -1;
29 }
30
31 /* Set the writer parameters. */
32 xmlw_setParams( writer );
33
34 /* Start writer. */
35 xmlw_start( writer );
36 xmlw_startElem( writer, "unidiff" );
37
38 /* Attributes. */
39 xmlw_attr( writer, "name", "test diff" );
40
41 /* Write the bulk of the diff, we assume they are sorted by target. */
42 for ( int i = 0; i < array_size( diffs ); i++ ) {
43 const UniHunk_t *h = &diffs[i];
44 const char *tag = diff_hunkTag( h->type );
45
46 /* Assuming sorted, so we try to group all diffs with same target. */
47 if ( ( target.type != h->target.type ) ||
48 strcmp( target.u.name, h->target.u.name ) != 0 ) {
49 if ( target.type != HUNK_TARGET_NONE )
50 xmlw_endElem( writer ); /* current target */
51 target = h->target;
52 switch ( target.type ) {
53 case HUNK_TARGET_SYSTEM:
54 xmlw_startElem( writer, "system" );
55 break;
56 case HUNK_TARGET_SPOB:
57 xmlw_startElem( writer, "spob" );
58 break;
59 case HUNK_TARGET_TECH:
60 xmlw_startElem( writer, "tech" );
61 break;
62 case HUNK_TARGET_FACTION:
63 xmlw_startElem( writer, "faction" );
64 break;
65
66 default:
67 WARN( _( "Trying to save unknown target type '%d'!" ),
68 target.type );
69 xmlw_startElem( writer, "unknown" );
70 break;
71 }
72 xmlw_attr( writer, "name", "%s", h->target.u.name );
73 }
74
75 /* Write the diff contents. */
76 switch ( h->dtype ) {
77 case HUNK_DATA_NONE:
78 xmlw_elemEmpty( writer, tag );
79 break;
80 case HUNK_DATA_STRING:
81 xmlw_elem( writer, tag, "%s", h->u.name );
82 break;
83 case HUNK_DATA_INT:
84 xmlw_elem( writer, tag, "%d", h->u.data );
85 break;
86 case HUNK_DATA_FLOAT:
87 xmlw_elem( writer, tag, "%f", h->u.fdata );
88 break;
89 case HUNK_DATA_POINTER:
90 WARN( _( "Hunk '%s' is trying to save pointer data!" ),
91 diff_hunkName( h->type ) );
92 break;
93 }
94 if ( target.type != HUNK_TARGET_NONE ) {
95 for ( int j = 0; i < array_size( h->attr ); i++ ) {
96 const UniAttribute_t *attr = &h->attr[j];
97 xmlw_attr_raw( writer, attr->name, (const xmlChar *)attr->value );
98 }
99 }
100 }
101 if ( target.type != HUNK_TARGET_NONE )
102 xmlw_endElem( writer ); /* current target */
103
104 xmlw_endElem( writer ); /* "unidiff" */
105 xmlw_done( writer );
106
107 /* No need for writer anymore. */
108 xmlFreeTextWriter( writer );
109
110 /* Write data. */
111 if ( xmlSaveFileEnc( filename, doc, "UTF-8" ) < 0 ) {
112 WARN( "Failed to write '%s'!", filename );
113 ret = -1;
114 }
115
116 /* Clean up. */
117 xmlFreeDoc( doc );
118
119 return ret;
120}
Provides macros to work with dynamic arrays.
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
Definition array.h:179
void xmlw_setParams(xmlTextWriterPtr writer)
Sets up the standard xml write parameters.
Definition nxml.c:59
Represents the hunk's target.
Definition unidiff.h:26
union UniHunkTarget_t::@075106202173013221375222217331323374140174001165 u
UniHunkTargetType_t type
Definition unidiff.h:27
char * name
Definition unidiff.h:29
Represents a single hunk in the diff.
Definition unidiff.h:162
UniHunkDataType_t dtype
Definition unidiff.h:165
union UniHunk_t::@375235000240300110336260027115076046055102130370 u
UniHunkType_t type
Definition unidiff.h:164
UniAttribute_t * attr
Definition unidiff.h:177
UniHunkTarget_t target
Definition unidiff.h:163
const char * diff_hunkTag(UniHunkType_t t)
Gets the XML tag of a hunk.
Definition unidiff.c:1930
const char * diff_hunkName(UniHunkType_t t)
Gets the human readable name of a hunk.
Definition unidiff.c:1922