2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * merge_text.c: text-file merge backend module
6 * Copyright (C) 2001 Jim Evins <evins@snaught.com>.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "merge-text.h"
31 #define LINE_BUF_LEN 1024
33 /*===========================================*/
35 /*===========================================*/
37 /*===========================================*/
39 /*===========================================*/
41 /*===========================================*/
42 /* Local function prototypes */
43 /*===========================================*/
44 static GList * split_fields( gchar *line, gchar delim );
45 static void free_fields( GList **fields );
48 /****************************************************************************/
49 /* Open merge source. */
50 /****************************************************************************/
52 gl_merge_text_open (glMergeType type,
59 fp = fopen (src, "r");
64 input = g_new0 (glMergeInput, 1);
66 input->field_defs = field_defs;
72 /****************************************************************************/
73 /* Close merge source. */
74 /****************************************************************************/
76 gl_merge_text_close (glMergeInput * input)
80 fclose ((FILE *) input->handle);
86 /****************************************************************************/
87 /* Get next record from merge source, NULL if no records left (i.e EOF) */
88 /****************************************************************************/
90 gl_merge_text_get_record (glMergeInput * input)
95 glMergeRecord *record = NULL;
97 gchar line[LINE_BUF_LEN];
101 switch (input->type) {
102 case GL_MERGE_TEXT_TAB:
105 case GL_MERGE_TEXT_COLON:
108 case GL_MERGE_TEXT_COMMA:
112 g_warning ("Unexpected merge type");
116 while (fgets (line, LINE_BUF_LEN, (FILE *) input->handle) !=
118 if (TRUE /* TODO: skip blank lines or comments */ ) {
120 record = g_new0 (glMergeRecord, 1);
121 record->select_flag = TRUE;
122 fields = split_fields (line, delim);
124 for (p=fields; p != NULL; p=p->next) {
126 g_strdup_printf ("%d", i_field++);
127 field = g_new0 (glMergeField, 1);
128 field->value = g_strdup (p->data);
130 gl_merge_find_key (input->
133 g_list_append (record->field_list, field);
136 free_fields (&fields);
145 /****************************************************************************/
146 /* Retrieve a list of raw fields (columns in this case) */
147 /****************************************************************************/
149 gl_merge_text_get_raw_record (glMergeInput * input)
152 gchar line[LINE_BUF_LEN], delim;
155 glMergeRawField *raw_field;
159 switch (input->type) {
160 case GL_MERGE_TEXT_TAB:
163 case GL_MERGE_TEXT_COLON:
166 case GL_MERGE_TEXT_COMMA:
170 g_warning ("Unexpected merge type");
174 while (fgets (line, LINE_BUF_LEN, (FILE *) input->handle)
176 if (TRUE /* TODO: skip blank lines or comments */ ) {
178 fields = split_fields (line, delim);
180 for (p=fields; p != NULL; p=p->next) {
182 g_new0 (glMergeRawField, 1);
184 g_strdup_printf ("%d",
186 raw_field->value = g_strdup (p->data);
187 list = g_list_append (list, raw_field);
189 free_fields (&fields);
198 /*---------------------------------------------------------------------------*/
199 /* PRIVATE. Split out fields by delimiter while decoding things like "\n". */
200 /*---------------------------------------------------------------------------*/
201 static GList * split_fields ( gchar *line,
207 enum { NORMAL, ESCAPED } state;
209 g_return_val_if_fail (line != NULL, NULL);
212 string = g_string_new( "" );
213 for ( c=line; *c!=0; c++ ) {
220 } else if ( *c != delim ) {
221 string = g_string_append_c (string, *c);
223 list = g_list_append (list,
224 g_strdup (string->str));
225 string = g_string_assign( string, "" );
232 string = g_string_append_c (string, '\n');
235 string = g_string_append_c (string, '\t');
238 string = g_string_append_c (string, *c);
245 g_assert_not_reached();
250 list = g_list_append( list, g_strdup(string->str) );
251 g_string_free( string, TRUE );
256 /*---------------------------------------------------------------------------*/
257 /* Free list of fields. */
258 /*---------------------------------------------------------------------------*/
260 free_fields (GList ** list)
264 for (p = *list; p != NULL; p = p->next) {