~ubuntu-core-dev/update-notifier/ubuntu

78 by mvo
* src/*.c: added #include "config.h" (/me <- stupid for forgeting it)
1
#ifdef HAVE_CONFIG_H
2
#include "config.h"
3
#endif
4
45 by mvo
* added basic "interactive-update-hooks" support
5
#include <stdio.h>
6
#include <ctype.h>
7
8
9
#include "rfc822.h"
10
11
#include <glib.h>
12
#include <stdarg.h>
13
#include <stdlib.h>
14
#include <string.h>
15
16
17
/*
18
 * Function: rfc822db_parse_stanza
19
 * Input: a FILE pointer to an open readable file containing a stanza in rfc822 
20
 *    format.
21
 * Output: a pointer to a dynamically allocated rfc822_header structure
22
 * Description: parse a stanza from file into the returned header struct
23
 * Assumptions: no lines are over 8192 bytes long.
24
 */
25
26
struct rfc822_header* rfc822_parse_stanza(FILE *file)
27
{
28
    struct rfc822_header *head, **tail, *cur;
29
    char buf[8192];
30
31
    head = NULL;
32
    tail = &head;
33
    cur = NULL;
34
35
    /*    fprintf(stderr,"rfc822db_parse_stanza(file)\n");*/
36
    while (fgets(buf, sizeof(buf), file))
37
    {
38
        char *tmp = buf;
39
40
        if (*tmp == '\n')
41
            break;
42
43
	if (buf[strlen(buf)-1] == '\n') 
44
	   buf[strlen(buf)-1] = '\0';
45
300 by Michael Vogt
* src/rfc822.c:
46
	// " ." -> \n 
47
	if (isspace(*tmp) && 
48
	    *(tmp+1) != 0 && *(tmp+1) == '.' &&
49
	    *(tmp+2) == 0)
50
	{
51
	   gchar *now = cur->value;
52
	   cur->value = g_strconcat(now, "\n", NULL);
53
	   g_free(now);
54
	}
55
	else if (isspace(*tmp))
45 by mvo
* added basic "interactive-update-hooks" support
56
        {
300 by Michael Vogt
* src/rfc822.c:
57
	   gchar *now = cur->value;
58
	   if(strlen(now) == 0 || g_str_has_suffix(now, " ") || g_str_has_suffix(now, "\n"))
59
	      cur->value = g_strconcat(now, g_strstrip(tmp), NULL);
60
	   else	      
61
	      cur->value = g_strconcat(now, " ", g_strstrip(tmp), NULL);
62
	   g_free(now);
45 by mvo
* added basic "interactive-update-hooks" support
63
        } 
64
        else 
65
        {
66
            while (*tmp != 0 && *tmp != ':')
67
                tmp++;
68
            *tmp++ = '\0';
69
70
            cur = g_new0(struct rfc822_header,1);
71
            if (cur == NULL)
72
                return NULL;
73
            cur->header = strdup(buf);
74
75
            while (isspace(*tmp))
76
                tmp++;
300 by Michael Vogt
* src/rfc822.c:
77
            cur->value = strdup(tmp);
45 by mvo
* added basic "interactive-update-hooks" support
78
79
            *tail = cur;
80
            tail = &cur->next;
81
        }
82
    }
83
84
    return head;
85
}
86
87
88
char *rfc822_header_lookup(struct rfc822_header *list, const char* key)
89
{
90
/*    fprintf(stderr,"rfc822db_header_lookup(list,key=%s)\n",key);*/
91
    while (list && (strcasecmp(key, list->header) != 0))
92
        list = list->next;
93
    if (!list)
94
        return NULL;
95
/*    fprintf(stderr,"rfc822db_header_lookup returning: '%s'\n", list->value);*/
96
    return list->value;
97
}
98
99
100
void rfc822_header_free_all(struct rfc822_header *list)
101
{
102
   while (list) { 
103
      struct rfc822_header *now = list;
104
      g_free(list->header);
105
      g_free(list->value);
106
107
      list = list->next;
108
      g_free(now);
109
   }
110
}