Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
aports
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Monitor
Service Desk
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
alpine
aports
Commits
a191920d
Commit
a191920d
authored
12 years ago
by
Bartłomiej Piotrowski
Browse files
Options
Downloads
Patches
Plain Diff
testing/abook: new aport
parent
ca281c03
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
testing/abook/APKBUILD
+33
-0
33 additions, 0 deletions
testing/abook/APKBUILD
testing/abook/vcard-compat.patch
+346
-0
346 additions, 0 deletions
testing/abook/vcard-compat.patch
with
379 additions
and
0 deletions
testing/abook/APKBUILD
0 → 100644
+
33
−
0
View file @
a191920d
# Maintainer: Bartłomiej Piotrowski <nospam@bpiotrowski.pl>
pkgname
=
abook
pkgver
=
0.6.0_pre2
_ver
=
0.6.0pre2
pkgrel
=
0
pkgdesc
=
'Text-based addressbook designed for use with Mutt'
url
=
'http://abook.sourceforge.net/'
license
=
'GPL2'
arch
=
'all'
makedepends
=
'libiconv-dev ncurses-dev readline-dev'
subpackages
=
"
$pkgname
-doc"
source
=
"http://
$pkgname
.sourceforge.net/devel/
$pkgname
-
${
_ver
}
.tar.gz
vcard-compat.patch"
prepare
()
{
cd
"
$srcdir
/
$pkgname
-
$_ver
"
patch
-Np1
-i
"
$srcdir
"
/vcard-compat.patch
}
build
()
{
cd
"
$srcdir
/
$pkgname
-
$_ver
"
./configure
--prefix
=
/usr
--mandir
=
/usr/share/man
make
}
package
()
{
cd
"
$srcdir
/
$pkgname
-
$_ver
"
make
DESTDIR
=
"
$pkgdir
"
install
}
md5sums
=
"1e4a7210b3507db7b3d47ee7a2457934 abook-0.6.0pre2.tar.gz
c7c4972eab913483198d86697ecbbaa1 vcard-compat.patch"
This diff is collapsed.
Click to expand it.
testing/abook/vcard-compat.patch
0 → 100644
+
346
−
0
View file @
a191920d
diff -aur old/filter.c new/filter.c
--- old/filter.c 2006-09-06 15:26:10.000000000 +1000
+++ new/filter.c 2012-05-31 17:48:18.644744197 +1000
@@ -44,6 +44,7 @@
static int csv_parse_file(FILE *in);
static int allcsv_parse_file(FILE *in);
static int palmcsv_parse_file(FILE *in);
+static int vcard_parse_file(FILE *in);
/*
* export filter prototypes
@@ -75,6 +76,7 @@
{ "csv", N_("comma separated values"), csv_parse_file },
{ "allcsv", N_("comma separated values (all fields)"), allcsv_parse_file },
{ "palmcsv", N_("Palm comma separated values"), palmcsv_parse_file },
+ { "vcard", N_("vCard file"), vcard_parse_file },
{ "\0", NULL, NULL }
};
@@ -1331,6 +1333,263 @@
*/
/*
+ * vCard import filter
+ */
+
+static char *vcard_fields[] = {
+ "FN", /* NAME */
+ "EMAIL", /* EMAIL */
+ "ADR", /* ADDRESS */
+ "ADR", /* ADDRESS2 - not used */
+ "ADR", /* CITY */
+ "ADR", /* STATE */
+ "ADR", /* ZIP */
+ "ADR", /* COUNTRY */
+ "TEL", /* PHONE */
+ "TEL", /* WORKPHONE */
+ "TEL", /* FAX */
+ "TEL", /* MOBILEPHONE */
+ "NICKNAME", /* NICK */
+ "URL", /* URL */
+ "NOTE", /* NOTES */
+ "BDAY", /* ANNIVERSARY */
+ NULL
+};
+
+/*
+ * mappings between vCard ADR field and abook's ADDRESS
+ * see rfc2426 section 3.2.1
+ */
+static int vcard_address_fields[] = {
+ -1, /* vCard(post office box) - not used */
+ -1, /* vCard(the extended address) - not used */
+ 2, /* vCard(the street address) - ADDRESS */
+ 4, /* vCard(the locality) - CITY */
+ 5, /* vCard(the region) - STATE */
+ 6, /* vCard(the postal code) - ZIP */
+ 7 /* vCard(the country name) - COUNTRY */
+};
+
+enum {
+ VCARD_KEY = 0,
+ VCARD_KEY_ATTRIBUTE,
+ VCARD_VALUE,
+};
+
+static char *
+vcard_get_line_element(char *line, int element)
+{
+ int i;
+ char *line_copy = 0;
+ char *result = 0;
+ char *key = 0;
+ char *key_attr = 0;
+ char *value = 0;
+
+ line_copy = xstrdup(line);
+
+ /* make newline characters if exist end of string */
+ for(i=0; line_copy[i]; i++) {
+ if(line_copy[i] == '\r' || line_copy[i] == '\n') {
+ line_copy[i] = '\0';
+ break;
+ }
+ }
+
+ /* separate key from value */
+ for(i=0; line_copy[i]; i++) {
+ if(line_copy[i] == ':') {
+ line_copy[i] = '\0';
+ key = line_copy;
+ value = &line_copy[i+1];
+ break;
+ }
+ }
+
+ /* separate key from key attributes */
+ if (key) {
+ for(i=0; key[i]; i++) {
+ if(key[i] == ';') {
+ key[i] = '\0';
+ key_attr = &key[i+1];
+ break;
+ }
+ }
+ }
+
+ switch(element) {
+ case VCARD_KEY:
+ if(key)
+ result = xstrdup(key);
+ break;
+ case VCARD_KEY_ATTRIBUTE:
+ if(key_attr)
+ result = xstrdup(key_attr);
+ break;
+ case VCARD_VALUE:
+ if(value)
+ result = xstrdup(value);
+ break;
+ }
+
+ xfree(line_copy);
+ return result;
+}
+
+static void
+vcard_parse_email(list_item item, char *line)
+{
+ char *email;
+
+ email = vcard_get_line_element(line, VCARD_VALUE);
+
+ if(item[1]) {
+ item[1] = strconcat(item[1], ",", email, 0);
+ xfree(email);
+ }
+ else {
+ item[1] = email;
+ }
+}
+
+static void
+vcard_parse_address(list_item item, char *line)
+{
+ int i;
+ int k;
+ char *value;
+ char *address_field;
+
+ value = vcard_get_line_element(line, VCARD_VALUE);
+ if(!value)
+ return;
+
+ address_field = value;
+ for(i=k=0; value[i]; i++) {
+ if(value[i] == ';') {
+ value[i] = '\0';
+ if(vcard_address_fields[k] >= 0) {
+ item[vcard_address_fields[k]] = xstrdup(address_field);
+ }
+ address_field = &value[i+1];
+ k++;
+ if((k+1)==(sizeof(vcard_address_fields)/sizeof(*vcard_address_fields)))
+ break;
+ }
+ }
+ item[vcard_address_fields[k]] = xstrdup(address_field);
+ xfree(value);
+}
+
+static void
+vcard_parse_phone(list_item item, char *line)
+{
+ int index = 8;
+ char *type = vcard_get_line_element(line, VCARD_KEY_ATTRIBUTE);
+ char *value = vcard_get_line_element(line, VCARD_VALUE);
+
+ /* set the standard number */
+ if (!type) {
+ item[index] = value;
+ }
+
+ /*
+ * see rfc2426 section 3.3.1
+ */
+ else if (strstr(type, "TYPE=") == type){
+ if (strcasestr(type, "home")) {
+ item[index] = xstrdup(value);
+ }
+ if (strcasestr(type, "work")) {
+ item[index+1] = xstrdup(value);
+ }
+ if (strcasestr(type, "fax")) {
+ item[index+2] = xstrdup(value);
+ }
+ if (strcasestr(type, "cell")) {
+ item[index+3] = xstrdup(value);
+ }
+
+ xfree(type);
+ xfree(value);
+ }
+}
+
+static void
+vcard_parse_line(list_item item, char *line)
+{
+ int i;
+ char *key;
+
+ for(i=0; vcard_fields[i]; i++) {
+ key = vcard_fields[i];
+
+ if(!strncmp(key, line, strlen(key))) {
+ if(i == 1) {
+ vcard_parse_email(item, line);
+ }
+ else if(i == 2) {
+ vcard_parse_address(item, line);
+ }
+ else if(i == 8) {
+ vcard_parse_phone(item, line);
+ }
+ else {
+ item[i] = vcard_get_line_element(line, VCARD_VALUE);
+ }
+ break;
+ }
+ }
+}
+
+static void
+vcard_parse_item(FILE *in)
+{
+ char *line = NULL;
+ list_item item = item_create();
+
+ while(!feof(in)) {
+ line = getaline(in);
+
+ if(line && !strncmp("END:VCARD", line, 9)) {
+ xfree(line);
+ break;
+ }
+ else if(line) {
+ vcard_parse_line(item, line);
+ xfree(line);
+ }
+ }
+
+ add_item2database(item);
+ item_free(&item);
+}
+
+static int
+vcard_parse_file(FILE *in)
+{
+ char *line = NULL;
+
+ while(!feof(in)) {
+ line = getaline(in);
+
+ if(line && !strncmp("BEGIN:VCARD", line, 11)) {
+ xfree(line);
+ vcard_parse_item(in);
+ }
+ else if(line) {
+ xfree(line);
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * end of vCard import filter
+ */
+
+/*
* csv addressbook export filters
*/
@@ -1547,10 +1806,18 @@
free(name);
+ if(db_fget(e.item, NICK))
+ fprintf(out, "NICKNAME:%s\r\n",
+ db_fget(e.item, NICK));
+
+ if(db_fget(e.item, ANNIVERSARY))
+ fprintf(out, "BDAY:%s\r\n",
+ db_fget(e.item, ANNIVERSARY));
+
if(db_fget(e.item, ADDRESS))
- fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\r\n",
- safe_str(db_fget(e.item, ADDRESS)),
+ fprintf(out, "ADR:;%s;%s;%s;%s;%s;%s\r\n",
safe_str(db_fget(e.item, ADDRESS2)),
+ safe_str(db_fget(e.item, ADDRESS)),
safe_str(db_fget(e.item, CITY)),
safe_str(db_fget(e.item, STATE)),
safe_str(db_fget(e.item, ZIP)),
diff -aur old/misc.c new/misc.c
--- old/misc.c 2006-09-05 05:24:18.000000000 +1000
+++ new/misc.c 2012-05-31 17:40:46.241284874 +1000
@@ -77,6 +77,27 @@
return 1;
}
+char *
+strcasestr(char *haystack, char *needle)
+{
+ int i;
+ int k;
+
+ assert(haystack != NULL);
+ assert(needle != NULL);
+
+ for(i=0; i<strlen(haystack)-strlen(needle)+1; i++) {
+ for(k=0; k<strlen(needle); k++, i++) {
+ if (tolower(haystack[i]) != tolower(needle[k]))
+ break;
+ else if ((k+1) == strlen(needle))
+ return &haystack[i];
+ }
+ }
+
+ return NULL;
+}
+
#ifdef HAVE_CONFIG_H
# include "config.h"
diff -aur old/misc.h new/misc.h
--- old/misc.h 2006-09-05 05:24:18.000000000 +1000
+++ new/misc.h 2012-05-31 17:40:46.241284874 +1000
@@ -18,6 +18,8 @@
int is_number(char *s);
+char *strcasestr(char *haystack, char *needle);
+
char *strdup_printf(const char *format, ... );
char *strconcat(const char *str, ...);
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment