From 5f8e0f8ef9a422691dd72e8a953a42a41478fcb4 Mon Sep 17 00:00:00 2001 From: Tatsuya Kinoshita Date: Wed, 4 May 2011 16:18:09 +0900 Subject: Releasing debian version 0.5.1-1 --- w3mbookmark.c | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 w3mbookmark.c (limited to 'w3mbookmark.c') diff --git a/w3mbookmark.c b/w3mbookmark.c new file mode 100644 index 0000000..74d7203 --- /dev/null +++ b/w3mbookmark.c @@ -0,0 +1,248 @@ +/* $Id: w3mbookmark.c,v 1.10 2003/09/23 18:42:25 ukai Exp $ */ +#include +#include +#include "config.h" +#include "Str.h" +#include "indep.h" +#include "textlist.h" +#include "parsetag.h" + +#if LANG == JA +/* FIXME: gettextize here */ +#define BKMARK_TITLE "ブックマークの登録" +#define BKMARK_ADD "登録" +#define DEFAULT_SECTION "未分類" +#else +#define BKMARK_TITLE "Register to my bookmark" +#define BKMARK_ADD "ADD" +#define DEFAULT_SECTION "Miscellaneous" +#endif + +static char *bkmark_src1 = + "\n\ +\n\ +" BKMARK_TITLE "\n\ +\n\ +\n\ +

" BKMARK_TITLE "

\n\ +
\n\ +\n\ +\n\ +\n\ +\n"; + +static char *bkmark_src2 = + "
New Section:\n\ +
URL:\n\ +
Title:\n\ +
\n\ +
\n\ +
\n\ +\n\ +\n"; + +#undef FALSE +#define FALSE 0 +#undef TRUE +#define TRUE 1 + +static char end_section[] = + "\n"; + +static char *Local_cookie = NULL; + +void +print_bookmark_panel(char *bmark, char *url, char *title) +{ + Str tmp, tmp2; + FILE *f; + char *p; + +#if LANG == JA + /* FIXME: gettextize here */ + printf("Content-Type: text/html; charset=EUC-JP\n\n"); +#else + printf("Content-Type: text/html\n\n"); +#endif + printf(bkmark_src1, html_quote(bmark), html_quote(Local_cookie)); + if ((f = fopen(bmark, "r")) != NULL) { + printf("Section:\n"); + } + printf(bkmark_src2, html_quote(url), html_quote(title)); +} + +/* create new bookmark */ +static int +create_new_bookmark(char *bmark, char *section, char *title, char *url, + char *mode) +{ + FILE *f; + f = fopen(bmark, mode); + if (f == NULL) { + printf("\nCan't open bookmark %s\n", bmark); + return FALSE; + } + else { + fprintf(f, "Bookmarks\n"); + fprintf(f, "\n

Bookmarks

\n"); + fprintf(f, "

%s

\n
    \n", section); + fprintf(f, "
  • %s\n", url, title); + fprintf(f, end_section); + fprintf(f, "
\n\n\n"); + fclose(f); + } + return TRUE; +} + +int +insert_bookmark(char *bmark, struct parsed_tagarg *data) +{ + char *url, *title, *section; + FILE *f; + TextList *tl = newTextList(); + int section_found = 0; + int bmark_added = 0; + Str tmp, section_tmp; + + url = tag_get_value(data, "url"); + title = tag_get_value(data, "title"); + section = tag_get_value(data, "newsection"); + if (section == NULL || *section == '\0') + section = tag_get_value(data, "section"); + if (section == NULL || *section == '\0') + section = DEFAULT_SECTION; + + if (url == NULL || *url == '\0' || title == NULL || *title == '\0') { + /* Bookmark not added */ + return FALSE; + } + url = html_quote(url); + title = html_quote(title); + section = html_quote(section); + + f = fopen(bmark, "r"); + if (f == NULL) + return create_new_bookmark(bmark, section, title, url, "w"); + + section_tmp = Sprintf("

%s

\n", section); + for (;;) { + tmp = Strfgets(f); + if (tmp->length == 0) + break; + if (Strcasecmp(tmp, section_tmp) == 0) + section_found = 1; + if (section_found && !bmark_added) { + Strremovefirstspaces(tmp); + if (Strcmp_charp(tmp, end_section) == 0) { + pushText(tl, + Sprintf("
  • %s\n", url, + title)->ptr); + bmark_added = 1; + } + } + if (!bmark_added && Strcasecmp_charp(tmp, "\n") == 0) { + pushText(tl, Sprintf("

    %s

    \n
      \n", section)->ptr); + pushText(tl, + Sprintf("
    • %s\n", url, title)->ptr); + pushText(tl, end_section); + pushText(tl, "
    \n"); + bmark_added = 1; + } + pushText(tl, tmp->ptr); + } + fclose(f); + if (!bmark_added) { + /* Bookmark not added; perhaps the bookmark file is ill-formed */ + /* In this case, a new bookmark is appeneded after the bookmark file */ + return create_new_bookmark(bmark, section, title, url, "a"); + } + f = fopen(bmark, "w"); + while (tl->nitem) { + fputs(popText(tl), f); + } + fclose(f); + return TRUE; +} + +int +main(int argc, char *argv[], char **envp) +{ + extern char *getenv(); + char *p; + int length; + Str qs = NULL; + struct parsed_tagarg *cgiarg; + char *mode; + char *bmark; + char *url; + char *title; + char *sent_cookie; + + p = getenv("REQUEST_METHOD"); + if (p == NULL || strcasecmp(p, "post")) + goto request_err; + p = getenv("CONTENT_LENGTH"); + if (p == NULL || (length = atoi(p)) <= 0) + goto request_err; + + qs = Strfgets(stdin); + Strchop(qs); + if (qs->length != length) + goto request_err; + cgiarg = cgistr2tagarg(qs->ptr); + + p = getenv("LOCAL_COOKIE_FILE"); + if (p) { + FILE *f = fopen(p, "r"); + if (f) { + Local_cookie = Strfgets(f)->ptr; + fclose(f); + } + } + sent_cookie = tag_get_value(cgiarg, "cookie"); + if (sent_cookie == NULL || Local_cookie == NULL || + strcmp(sent_cookie, Local_cookie) != 0) { + /* local cookie doesn't match: It may be an illegal invocation */ + printf("Content-Type: text/plain\n\n"); + printf("Local cookie doesn't match: It may be an illegal invocation\n"); + exit(1); + } + + mode = tag_get_value(cgiarg, "mode"); + bmark = expandPath(tag_get_value(cgiarg, "bmark")); + url = tag_get_value(cgiarg, "url"); + title = tag_get_value(cgiarg, "title"); + if (bmark == NULL || url == NULL) + goto request_err; + if (mode && !strcmp(mode, "panel")) { + if (title == NULL) + title = ""; + print_bookmark_panel(bmark, url, title); + } + else if (mode && !strcmp(mode, "register")) { + printf("Content-Type: text/plain\n"); + if (insert_bookmark(bmark, cgiarg)) { + printf("w3m-control: BACK\n"); + printf("w3m-control: BACK\n"); + } + printf("\n"); + } + return 0; + + request_err: + printf("Content-Type: text/plain\n\n"); + printf("Incomplete Request: %s\n", qs ? qs->ptr : "(null)"); + exit(1); +} -- cgit v1.2.3