13 char *prev
; /* the previous matched position */
16 static int file_size(int fd
)
23 static int xread(int fd
, char *buf
, int len
)
27 int cr
= read(fd
, buf
+ nr
, len
- nr
);
35 struct uidl
*uidl_read(char *filename
)
37 struct uidl
*uidl
= malloc(sizeof(*uidl
));
39 memset(uidl
, 0, sizeof(*uidl
));
40 uidl
->fd
= open(filename
, O_RDWR
| O_CREAT
, 0600);
41 len
= file_size(uidl
->fd
);
42 lseek(uidl
->fd
, 0, SEEK_SET
);
43 uidl
->txt
= malloc(len
+ 1);
44 xread(uidl
->fd
, uidl
->txt
, len
);
45 uidl
->txt
[len
] = '\0';
46 lseek(uidl
->fd
, 0, SEEK_END
);
50 static char *find_str(char *s
, char *id
)
54 if (!strncmp(s
, id
, len
) && s
[len
] == '\n')
62 int uidl_find(struct uidl
*uidl
, char *id
)
65 uidl
->prev
= find_str(uidl
->prev
, id
);
67 uidl
->prev
= find_str(uidl
->txt
, id
);
68 return uidl
->prev
!= NULL
;
71 void uidl_add(struct uidl
*uidl
, char *id
)
74 snprintf(kw
, sizeof(kw
), "%s\n", id
);
75 write(uidl
->fd
, kw
, strlen(kw
));
78 void uidl_save(struct uidl
*uidl
)