6
6
// Copyright © 2018 Ryan Deschamps. All rights reserved.
7
7
//
8
8
9
- /** @file gexf.c
9
+ /** @file gexf.c
10
10
@brief Writes gexf files.
11
11
*/
12
12
@@ -48,10 +48,10 @@ int igraph_i_xml_escape(char* src, char** dest) {
48
48
}
49
49
50
50
/** Writes a GEXF file
51
-
51
+
52
52
GEXF provides great support for visualizations and is therefore used by a number
53
53
of light-weight visualization tools like SigmaJS and Gephi.
54
-
54
+
55
55
@param graph - the graph to write to gexf
56
56
@param outstream - a file object
57
57
@param prefixattr - if "true" will add prefixes to the gexf output.
@@ -72,37 +72,37 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
72
72
const char * gprefix = prefixattr ? "g_" : "" ;
73
73
const char * vprefix = prefixattr ? "v_" : "" ;
74
74
const char * eprefix = prefixattr ? "e_" : "" ;
75
-
76
- ret = fprintf (outstream , "<?xml version=\"1.1 \" encoding=\"UTF-8\"?>\n " );
75
+
76
+ ret = fprintf (outstream , "<?xml version=\"1.0 \" encoding=\"UTF-8\"?>\x0A " );
77
77
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
78
- ret = fprintf (outstream , "<gexf xmlns=\"http://www.gexf.net/1.3draft \"\n " );
78
+ ret = fprintf (outstream , "<gexf xmlns=\"http://www.gexf.net/1.2draft \"\x0A " );
79
79
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
80
- ret = fprintf (outstream , " xmlns:viz=\"http://www.gexf.net/1.3draft /viz\"\n " );
81
- ret = fprintf (outstream , " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n " );
80
+ ret = fprintf (outstream , " xmlns:viz=\"http://www.gexf.net/1.2draft /viz\"\x0A " );
81
+ ret = fprintf (outstream , " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\x0A " );
82
82
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
83
- ret = fprintf (outstream , " xsi:schemaLocation=\"http://www.gexf.net/1.3draft\n " );
83
+ ret = fprintf (outstream , " xsi:schemaLocation=\"http://www.gexf.net/1.2draft\x0A " );
84
84
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
85
- ret = fprintf (outstream , " http://www.gexf.net/1.3draft /gexf.xsd\"\n " );
85
+ ret = fprintf (outstream , " http://www.gexf.net/1.2draft /gexf.xsd\"\x0A " );
86
86
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
87
- ret = fprintf (outstream , " version=\"1.3 \">\n " );
87
+ ret = fprintf (outstream , " version=\"1.2 \">\x0A " );
88
88
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
89
- ret = fprintf (outstream , "<!-- Created by igraph -->\n " );
89
+ ret = fprintf (outstream , "<!-- Created by igraph -->\x0A " );
90
90
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
91
- ret = fprintf (outstream , "<meta lastmodifieddate=\"%.19s\">\n " , ctime (& t ));
91
+ ret = fprintf (outstream , "<meta lastmodifieddate=\"%.19s\">\x0A " , ctime (& t ));
92
92
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
93
- ret = fprintf (outstream , "<creator>Graphpass filtering using Igraph by Archives Unleashed</creator>\n " );
93
+ ret = fprintf (outstream , "<creator>Graphpass filtering using Igraph by Archives Unleashed</creator>\x0A " );
94
94
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
95
- ret = fprintf (outstream , "<description> A Filtered Derivative Graph</description>\n " );
95
+ ret = fprintf (outstream , "<description> A Filtered Derivative Graph</description>\x0A " );
96
96
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
97
- ret = fprintf (outstream , "</meta>\n " );
97
+ ret = fprintf (outstream , "</meta>\x0A " );
98
98
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
99
-
99
+
100
100
/* dump the <key> elements if any */
101
-
101
+
102
102
IGRAPH_VECTOR_INIT_FINALLY (& numv , 1 );
103
103
IGRAPH_STRVECTOR_INIT_FINALLY (& strv , 1 );
104
104
IGRAPH_VECTOR_BOOL_INIT_FINALLY (& boolv , 1 );
105
-
105
+
106
106
IGRAPH_STRVECTOR_INIT_FINALLY (& gnames , 0 );
107
107
IGRAPH_STRVECTOR_INIT_FINALLY (& vnames , 0 );
108
108
IGRAPH_STRVECTOR_INIT_FINALLY (& enames , 0 );
@@ -113,77 +113,77 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
113
113
& gnames , & gtypes ,
114
114
& vnames , & vtypes ,
115
115
& enames , & etypes );
116
-
117
- ret = fprintf (outstream , " <graph id=\"G\" defaultedgetype=\"%s\">\n " , (igraph_is_directed (graph )?"directed" :"undirected" ));
116
+
117
+ ret = fprintf (outstream , " <graph id=\"G\" defaultedgetype=\"%s\">\x0A " , (igraph_is_directed (graph )?"directed" :"undirected" ));
118
118
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
119
-
119
+
120
120
/* graph attributes */
121
- ret = fprintf (outstream , " <attributes class=\"graph\">\n " );
121
+ ret = fprintf (outstream , " <attributes class=\"graph\">\x0A " );
122
122
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
123
123
for (i = 0 ; i < igraph_vector_size (& gtypes ); i ++ ) {
124
124
char * name , * name_escaped ;
125
125
igraph_strvector_get (& gnames , i , & name );
126
126
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
127
127
if (VECTOR (gtypes )[i ] == IGRAPH_ATTRIBUTE_STRING ) {
128
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"string\"/>\n " , gprefix , name_escaped , name_escaped );
128
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"string\"/>\x0A " , gprefix , name_escaped , name_escaped );
129
129
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
130
130
} else if (VECTOR (gtypes )[i ] == IGRAPH_ATTRIBUTE_NUMERIC ) {
131
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"double\"/>\n " , gprefix , name_escaped , name_escaped );
131
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"double\"/>\x0A " , gprefix , name_escaped , name_escaped );
132
132
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
133
133
} else if (VECTOR (gtypes )[i ] == IGRAPH_ATTRIBUTE_BOOLEAN ) {
134
- ret = fprintf (outstream , " <attribute id=\"%s%s\" attr.title=\"%s\" type=\"boolean\"/>\n " , gprefix , name_escaped , name_escaped );
134
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" attr.title=\"%s\" type=\"boolean\"/>\x0A " , gprefix , name_escaped , name_escaped );
135
135
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
136
136
}
137
137
igraph_Free (name_escaped );
138
138
}
139
- ret = fprintf (outstream , " </attributes>\n " );
139
+ ret = fprintf (outstream , " </attributes>\x0A " );
140
140
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
141
-
141
+
142
142
/* vertex attributes */
143
- ret = fprintf (outstream , " <attributes class=\"node\">\n " );
143
+ ret = fprintf (outstream , " <attributes class=\"node\">\x0A " );
144
144
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
145
-
145
+
146
146
for (i = 0 ; i < igraph_vector_size (& vtypes ); i ++ ) {
147
147
char * name , * name_escaped ;
148
148
igraph_strvector_get (& vnames , i , & name );
149
149
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
150
150
if (VECTOR (vtypes )[i ] == IGRAPH_ATTRIBUTE_STRING ) {
151
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"string\"></attribute>\n " , vprefix , name_escaped , name_escaped );
151
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"string\"></attribute>\x0A " , vprefix , name_escaped , name_escaped );
152
152
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
153
153
} else if (VECTOR (vtypes )[i ] == IGRAPH_ATTRIBUTE_NUMERIC ) {
154
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"double\"></attribute>\n " , vprefix , name_escaped , name_escaped );
154
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"double\"></attribute>\x0A " , vprefix , name_escaped , name_escaped );
155
155
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
156
156
} else if (VECTOR (vtypes )[i ] == IGRAPH_ATTRIBUTE_BOOLEAN ) {
157
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"boolean\"></attribute>\n " , vprefix , name_escaped , name_escaped );
157
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"boolean\"></attribute>\x0A " , vprefix , name_escaped , name_escaped );
158
158
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
159
159
}
160
160
igraph_Free (name_escaped );
161
161
}
162
- ret = fprintf (outstream , " </attributes>\n " );
162
+ ret = fprintf (outstream , " </attributes>\x0A " );
163
163
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
164
-
164
+
165
165
/* edge attributes */
166
- ret = fprintf (outstream , " <attributes class=\"edge\">\n " );
166
+ ret = fprintf (outstream , " <attributes class=\"edge\">\x0A " );
167
167
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
168
168
for (i = 0 ; i < igraph_vector_size (& etypes ); i ++ ) {
169
169
char * name , * name_escaped ;
170
170
igraph_strvector_get (& enames , i , & name );
171
171
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
172
172
if (VECTOR (etypes )[i ] == IGRAPH_ATTRIBUTE_STRING ) {
173
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"string\"/>\n " , eprefix , name_escaped , name_escaped );
173
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"string\"/>\x0A " , eprefix , name_escaped , name_escaped );
174
174
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
175
175
} else if (VECTOR (etypes )[i ] == IGRAPH_ATTRIBUTE_NUMERIC ) {
176
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"double\"/>\n " , eprefix , name_escaped , name_escaped );
176
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"double\"/>\x0A " , eprefix , name_escaped , name_escaped );
177
177
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
178
178
} else if (VECTOR (etypes )[i ] == IGRAPH_ATTRIBUTE_BOOLEAN ) {
179
- ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"boolean\"/>\n " , eprefix , name_escaped , name_escaped );
179
+ ret = fprintf (outstream , " <attribute id=\"%s%s\" title=\"%s\" type=\"boolean\"/>\x0A " , eprefix , name_escaped , name_escaped );
180
180
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
181
181
}
182
182
igraph_Free (name_escaped );
183
183
}
184
- ret = fprintf (outstream , " </attributes>\n " );
184
+ ret = fprintf (outstream , " </attributes>\x0A " );
185
185
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
186
-
186
+
187
187
/* Do not include graph attvalues for now but can add them later */
188
188
/*
189
189
for (i=0; i<igraph_vector_size(>ypes); i++) {
@@ -223,9 +223,9 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
223
223
if (ret<0) IGRAPH_ERROR("Write failed", IGRAPH_EFILE);
224
224
}
225
225
}*/
226
-
226
+
227
227
/* Let's dump the nodes first */
228
- ret = fprintf (outstream , " <nodes>\n " );
228
+ ret = fprintf (outstream , " <nodes>\x0A " );
229
229
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
230
230
vc = igraph_vcount (graph );
231
231
ec = igraph_ecount (graph );
@@ -237,7 +237,7 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
237
237
igraph_vector_init (& y , vc );
238
238
igraph_vector_init (& x , vc );
239
239
igraph_vector_init (& size , vc );
240
-
240
+
241
241
if (igraph_cattribute_has_attr (graph , IGRAPH_ATTRIBUTE_EDGE , "weight" ) == true) {
242
242
EANV (graph , "weight" , & weight );
243
243
}
@@ -249,7 +249,7 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
249
249
} else {
250
250
printf ("No label information available on this graph." );
251
251
}
252
-
252
+
253
253
/*if ( VASV(graph, "label", &label) == 0 ){
254
254
VASV(graph, "label", &label);
255
255
} else if (VASV(graph, "name", &label) == 0) {
@@ -267,9 +267,9 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
267
267
char * name , * name_escaped , * label , * label_escaped ;
268
268
igraph_strvector_get (& labels , l , & label );
269
269
IGRAPH_CHECK (igraph_i_xml_escape (label , & label_escaped ));
270
- ret = fprintf (outstream , " <node id=\"n%ld\" label=\"%s\">\n " , (long )l , label_escaped ? label_escaped : "x" );
270
+ ret = fprintf (outstream , " <node id=\"n%ld\" label=\"%s\">\x0A " , (long )l , label_escaped ? label_escaped : "x" );
271
271
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
272
- ret = fprintf (outstream , " <attvalues>\n " );
272
+ ret = fprintf (outstream , " <attvalues>\x0A " );
273
273
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
274
274
for (i = 0 ; i < igraph_vector_size (& vtypes ); i ++ ) {
275
275
if (VECTOR (vtypes )[i ] == IGRAPH_ATTRIBUTE_NUMERIC ) {
@@ -278,7 +278,7 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
278
278
igraph_vss_1 (l ), & numv ));
279
279
if (!isnan (VECTOR (numv )[0 ])) {
280
280
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
281
- ret = fprintf (outstream , " <attvalue for=\"%s%s\" value=\"%g\" />\n " ,
281
+ ret = fprintf (outstream , " <attvalue for=\"%s%s\" value=\"%g\" />\x0A " ,
282
282
vprefix , name_escaped , VECTOR (numv )[0 ]);
283
283
igraph_Free (name_escaped );
284
284
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
@@ -294,36 +294,36 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
294
294
igraph_vss_1 (l ), & strv ));
295
295
igraph_strvector_get (& strv , 0 , & s );
296
296
IGRAPH_CHECK (igraph_i_xml_escape (s , & s_escaped ));
297
- ret = fprintf (outstream , "%s\" />\n " , s_escaped );
297
+ ret = fprintf (outstream , "%s\" />\x0A " , s_escaped );
298
298
igraph_Free (s_escaped );
299
299
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
300
300
} else if (VECTOR (vtypes )[i ] == IGRAPH_ATTRIBUTE_BOOLEAN ) {
301
301
igraph_strvector_get (& vnames , i , & name );
302
302
IGRAPH_CHECK (igraph_i_attribute_get_bool_vertex_attr (graph , name ,
303
303
igraph_vss_1 (l ), & boolv ));
304
304
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
305
- ret = fprintf (outstream , " <attvalue for=\"%s%s\" value=\"%s\" />\n " ,
305
+ ret = fprintf (outstream , " <attvalue for=\"%s%s\" value=\"%s\" />\x0A " ,
306
306
vprefix , name_escaped , VECTOR (boolv )[0 ] ? "true" : "false" );
307
307
igraph_Free (name_escaped );
308
308
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
309
309
}
310
310
}
311
- ret = fprintf (outstream , " </attvalues>\n " );
311
+ ret = fprintf (outstream , " </attvalues>\x0A " );
312
312
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
313
- ret = fprintf (outstream , " <viz:color r=\"%i\" g=\"%i\" b=\"%i\"></viz:color>\n " , (int )VECTOR (r )[l ], (int )VECTOR (g )[l ], (int )VECTOR (b )[l ]);
313
+ ret = fprintf (outstream , " <viz:color r=\"%i\" g=\"%i\" b=\"%i\"></viz:color>\x0A " , (int )VECTOR (r )[l ], (int )VECTOR (g )[l ], (int )VECTOR (b )[l ]);
314
314
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
315
- ret = fprintf (outstream , " <viz:size value=\"%f\"></viz:size>\n " , VECTOR (size )[l ]);
315
+ ret = fprintf (outstream , " <viz:size value=\"%f\"></viz:size>\x0A " , VECTOR (size )[l ]);
316
316
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
317
- ret = fprintf (outstream , " <viz:position y=\"%f\" x=\"%f\" z=\"0.0\"></viz:position>\n " , VECTOR (y )[l ], VECTOR (x )[l ]);
317
+ ret = fprintf (outstream , " <viz:position y=\"%f\" x=\"%f\" z=\"0.0\"></viz:position>\x0A " , VECTOR (y )[l ], VECTOR (x )[l ]);
318
318
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
319
- ret = fprintf (outstream , " </node>\n " );
319
+ ret = fprintf (outstream , " </node>\x0A " );
320
320
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
321
321
}
322
- ret = fprintf (outstream , " </nodes>\n " );
322
+ ret = fprintf (outstream , " </nodes>\x0A " );
323
323
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
324
-
324
+
325
325
/* Now the edges */
326
- ret = fprintf (outstream , " <edges>\n " );
326
+ ret = fprintf (outstream , " <edges>\x0A " );
327
327
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
328
328
IGRAPH_CHECK (igraph_eit_create (graph , igraph_ess_all (0 ), & it ));
329
329
IGRAPH_FINALLY (igraph_eit_destroy , & it );
@@ -332,20 +332,20 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
332
332
char * name , * name_escaped ;
333
333
long int edge = IGRAPH_EIT_GET (it );
334
334
igraph_edge (graph , (igraph_integer_t ) edge , & from , & to );
335
- ret = fprintf (outstream , " <edge id=\"%ld\" source=\"n%ld\" target=\"n%ld\" weight=\"%f\">\n " ,
335
+ ret = fprintf (outstream , " <edge id=\"%ld\" source=\"n%ld\" target=\"n%ld\" weight=\"%f\">\x0A " ,
336
336
(long int )l , (long int )from , (long int )to , VECTOR (weight )[l ] ? VECTOR (weight )[l ] : 0.0 );
337
337
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
338
- ret = fprintf (outstream , " <attvalues>\n " );
338
+ ret = fprintf (outstream , " <attvalues>\x0A " );
339
339
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
340
-
340
+
341
341
for (i = 0 ; i < igraph_vector_size (& etypes ); i ++ ) {
342
342
if (VECTOR (etypes )[i ] == IGRAPH_ATTRIBUTE_NUMERIC ) {
343
343
igraph_strvector_get (& enames , i , & name );
344
344
IGRAPH_CHECK (igraph_i_attribute_get_numeric_edge_attr (graph , name ,
345
345
igraph_ess_1 ((igraph_integer_t ) edge ), & numv ));
346
346
if (!isnan (VECTOR (numv )[0 ])) {
347
347
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
348
- ret = fprintf (outstream , " <attvalue for=\"%s%s\" value=\"%g\"></attvalue>\n " ,
348
+ ret = fprintf (outstream , " <attvalue for=\"%s%s\" value=\"%g\"></attvalue>\x0A " ,
349
349
eprefix , name_escaped , VECTOR (numv )[0 ]);
350
350
igraph_Free (name_escaped );
351
351
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
@@ -361,36 +361,36 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
361
361
igraph_ess_1 ((igraph_integer_t ) edge ), & strv ));
362
362
igraph_strvector_get (& strv , 0 , & s );
363
363
IGRAPH_CHECK (igraph_i_xml_escape (s , & s_escaped ));
364
- ret = fprintf (outstream , "%s\"></attvalue>\n " , s_escaped );
364
+ ret = fprintf (outstream , "%s\"></attvalue>\x0A " , s_escaped );
365
365
igraph_Free (s_escaped );
366
366
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
367
367
} else if (VECTOR (etypes )[i ] == IGRAPH_ATTRIBUTE_BOOLEAN ) {
368
368
igraph_strvector_get (& enames , i , & name );
369
369
IGRAPH_CHECK (igraph_i_attribute_get_bool_edge_attr (graph , name ,
370
370
igraph_ess_1 ((igraph_integer_t ) edge ), & boolv ));
371
371
IGRAPH_CHECK (igraph_i_xml_escape (name , & name_escaped ));
372
- ret = fprintf (outstream , " <attvalue for=\"%s%s\" value\"%s\"></attvalue>\n " ,
372
+ ret = fprintf (outstream , " <attvalue for=\"%s%s\" value\"%s\"></attvalue>\x0A " ,
373
373
eprefix , name_escaped , VECTOR (boolv )[0 ] ? "true" : "false" );
374
374
igraph_Free (name_escaped );
375
375
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
376
376
}
377
377
}
378
- ret = fprintf (outstream , " </attvalues>\n " );
378
+ ret = fprintf (outstream , " </attvalues>\x0A " );
379
379
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
380
- ret = fprintf (outstream , " </edge>\n " );
380
+ ret = fprintf (outstream , " </edge>\x0A " );
381
381
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
382
382
IGRAPH_EIT_NEXT (it );
383
383
}
384
- ret = fprintf (outstream , " </edges>\n " );
384
+ ret = fprintf (outstream , " </edges>\x0A " );
385
385
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
386
386
igraph_eit_destroy (& it );
387
387
IGRAPH_FINALLY_CLEAN (1 );
388
-
389
- ret = fprintf (outstream , " </graph>\n " );
388
+
389
+ ret = fprintf (outstream , " </graph>\x0A " );
390
390
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
391
- fprintf (outstream , "</gexf>\n " );
391
+ fprintf (outstream , "</gexf>\x0A " );
392
392
if (ret < 0 ) IGRAPH_ERROR ("Write failed" , IGRAPH_EFILE );
393
-
393
+
394
394
igraph_strvector_destroy (& gnames );
395
395
igraph_strvector_destroy (& vnames );
396
396
igraph_strvector_destroy (& enames );
@@ -401,6 +401,6 @@ extern int igraph_write_graph_gexf(const igraph_t *graph, FILE *outstream,
401
401
igraph_strvector_destroy (& strv );
402
402
igraph_vector_bool_destroy (& boolv );
403
403
IGRAPH_FINALLY_CLEAN (9 );
404
-
404
+
405
405
return 0 ;
406
406
}
0 commit comments