From 2c50b5d9d5d5c34c2491926234c8325faed73dcd Mon Sep 17 00:00:00 2001 From: ketmar Date: Tue, 22 Apr 2008 00:16:04 +0000 Subject: [PATCH] can add more than one url from the command line; can read urls from list file FossilOrigin-Name: 125e922bd37867bf534312a92a1ce222805f46a5505efa952b57a4580ba7b637 --- ChangeLog | 1 + src/syren.c | 97 ++++++++++++++++++++++++++++++++++++++++++++------------- src/syren_str.c | 19 +++++++++-- src/syren_str.h | 2 ++ 4 files changed, 96 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 820a1f3..5ae678c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -168,3 +168,4 @@ v0.0.6 (atomic alien) [+] stupid script for sf.net is working! %-) [*] new version of KLISP; not teted yet + [+] can add more than one url from the command line; can read urls from list file diff --git a/src/syren.c b/src/syren.c index 2c92a3d..faf34d5 100644 --- a/src/syren.c +++ b/src/syren.c @@ -100,6 +100,9 @@ static TSyBool replyOnly = SY_FALSE; static int uEncodeDecode = 0; static TSyBool doRXVT = SY_FALSE; + +static TSyKVList *oURLList = NULL; + double lastSSave = 0; TSyState *state = NULL; /* dl state */ @@ -443,7 +446,7 @@ void DumpState (TSyState *state) { static void ShowHelp (void) { fprintf(stderr, "%s", - "usage: syren [options] url\n" + "usage: syren [options] url [+url] [+url] [@urllistfile]\n" "options:\n" \ " -h this help\n" " -h all show 'long' configuration options\n" @@ -509,9 +512,28 @@ static TSyResult GetStrOptWithAt (TSyPrintStr *prs, int argc, char *argv[], int } +static void SyAddURLFromFile (const char *fname) { + char *fl, *s, *e; + + fl = SyLoadWholeFile(fname); + if (!fl) return; + s = fl; while (*s) { + e = s; while (*e && *e != '\n') e++; + if (*e) *e++ = '\0'; + SyStrTrim(s); + if (*s) { + SyKVListDelete(oURLList, s); + SyKVListSet(oURLList, s, "", NULL); + } + s = e; + } + free(fl); +} + + static TSyResult ParseCmdLine (TSyPrintStr *prs, TSyCfg *cfg, int argc, char *argv[]) { int f, nomoreopt = 0; - char *s, *sopt, soptN[2]; + char *s, *t, *sopt, soptN[2]; TSyKVListItem *key; f = 1; while (f < argc) { @@ -608,14 +630,23 @@ static TSyResult ParseCmdLine (TSyPrintStr *prs, TSyCfg *cfg, int argc, char *ar } /* while */ } /* if */ } else { - if (oURL) { SyMessage(prs, SY_MSG_ERROR, "too many URLs"); return SY_ERROR; } - oURL = SyStrNew(s, -1); - if (!oURL) { SyMessage(prs, SY_MSG_ERROR, "memory error"); return SY_ERROR; } - SyStrTrim(oURL); + /* new URL */ + t = SyStrNew(s, -1); + if (!t) { SyMessage(prs, SY_MSG_ERROR, "memory error"); return SY_ERROR; } + SyStrTrim(t); + if (*t == '@') SyAddURLFromFile(t+1); + else if (*t) { + if (t[0] == '+') { strcpy(t, &(t[1])); SyStrTrim(t); } + if (*t) { + SyKVListDelete(oURLList, t); + SyKVListSet(oURLList, t, "", NULL); + } + } + SyStrFree(t); } } if (!writeCfg && !oStateFileName) { - if (!oURL || !(*oURL)) { SyMessage(prs, SY_MSG_ERROR, "URL?"); return SY_ERROR; } + if (!oURLList->first) { SyMessage(prs, SY_MSG_ERROR, "URL?"); return SY_ERROR; } } if (oResume && oStateFileName) { SyMessage(prs, SY_MSG_ERROR, "'-r'/'-s' conflict"); return SY_ERROR; } @@ -878,6 +909,7 @@ int main (int argc, char *argv[]) { char *s, *t; TSyResult res; int retCnt; + int userBreak = 0; prs.print = &SyPrintStr; prs.udata = NULL; @@ -903,6 +935,10 @@ int main (int argc, char *argv[]) { } SyCfgLoad(cfg, ".syrenrc", &prs); + oURLList = SyKVListNew(); + if (!oURLList) goto done; + oURLList->casesens = 1; + if (ParseCmdLine(&prs, cfg, argc, argv) != SY_OK) goto done; SyMessage(&prs, SY_MSG_MSG, "%s", SYREN_VERSION_DATETIME_STRING); @@ -942,9 +978,21 @@ int main (int argc, char *argv[]) { state->postData = oPostData; oPostData = NULL; +do { + res = SY_ERROR; + userBreak = 0; + if (!oStateFileName) { - if (!oURL) { SyMessage(&prs, SY_MSG_ERROR, "URL?"); goto done; } + if (!oURLList->first) break; + oURL = SyStrDup(oURLList->first->key); + SyKVListDelete(oURLList, oURLList->first->key); + if (!oURL) { + SyMessage(&prs, SY_MSG_ERROR, "memory error"); + goto done; + } + /*if (!oURL) { SyMessage(&prs, SY_MSG_ERROR, "URL?"); goto done; }*/ } else { + SyKVListClear(oURLList); SyMessage(&prs, SY_MSG_MSG, "restoring state from file %s", oStateFileName); if (oStateFileName && *oStateFileName) { s = SyLoadState(oStateFileName, state); @@ -1032,6 +1080,7 @@ int main (int argc, char *argv[]) { curState = NULL; if (res == SY_OK) break; if (state->interrupted == SY_TRUE) { + userBreak = 1; if (oStateFileName && *oStateFileName && state->status == SY_STATUS_DOWNLOADING && oNoStateFile != SY_TRUE) { SyMessage(&prs, SY_MSG_WARNING, "user break, saving state"); SySaveState(oStateFileName, state); @@ -1061,20 +1110,26 @@ int main (int argc, char *argv[]) { mainres = (res==SY_OK)?0:1; done: + SyStrFree(oURL); oURL = NULL; + SyStrFree(oOutFileName); oOutFileName = NULL; + SyStrFree(oStateFileName); oStateFileName = NULL; +} while (!userBreak); + SyFree(state); SyCfgFree(cfg); - if (cfgDefaultName) free(cfgDefaultName); - if (cfgIFace) free(cfgIFace); - if (cfgProxyHTTP) free(cfgProxyHTTP); - if (cfgProxyFTP) free(cfgProxyFTP); - if (cfgRefererStr) free(cfgRefererStr); - if (cfgUAStr) free(cfgUAStr); - if (oOutFileName) free(oOutFileName); - if (oStateFileName) free(oStateFileName); - if (oURL) free(oURL); - if (oPostData) free(oPostData); - if (oSendCookies) free(oSendCookies); - if (oCookieDump) free(oCookieDump); - if (oAddonHeaders) free(oAddonHeaders); + if (oURLList) SyKVListFree(oURLList); + if (cfgDefaultName) SyStrFree(cfgDefaultName); + if (cfgIFace) SyStrFree(cfgIFace); + if (cfgProxyHTTP) SyStrFree(cfgProxyHTTP); + if (cfgProxyFTP) SyStrFree(cfgProxyFTP); + if (cfgRefererStr) SyStrFree(cfgRefererStr); + if (cfgUAStr) SyStrFree(cfgUAStr); + SyStrFree(oURL); + SyStrFree(oOutFileName); + SyStrFree(oStateFileName); + if (oPostData) SyStrFree(oPostData); + if (oSendCookies) SyStrFree(oSendCookies); + if (oCookieDump) SyStrFree(oCookieDump); + if (oAddonHeaders) SyStrFree(oAddonHeaders); #ifdef SYREN_USE_SCRIPT SyScriptDeinit(); diff --git a/src/syren_str.c b/src/syren_str.c index 5ae27c0..7e5eb3b 100644 --- a/src/syren_str.c +++ b/src/syren_str.c @@ -76,6 +76,20 @@ void SyKVListFree (TSyKVList *lst) { } +void SyKVListClearItem (TSyKVListItem *item) { + if (!item) return; + SyStrFree(item->key); SyStrFree(item->value); SyStrFree(item->ustr); + memset(item, 0, sizeof(TSyKVListItem)); +} + + +void SyKVListFreeItem (TSyKVListItem *item) { + if (!item) return; + SyStrFree(item->key); SyStrFree(item->value); SyStrFree(item->ustr); + free(item); +} + + void SyKVListClear (TSyKVList *lst) { TSyKVListItem *item, *next; @@ -83,7 +97,7 @@ void SyKVListClear (TSyKVList *lst) { item = lst->first; while (item) { next = item->next; - SyStrFree(item->key); SyStrFree(item->value); SyStrFree(item->ustr); free(item); + SyKVListFreeItem(item); item = next; } lst->first = lst->last = NULL; @@ -119,7 +133,8 @@ TSyResult SyKVListDelete (TSyKVList *lst, const char *key) { if (prev) prev->next = item->next; else lst->first = item->next; if (!item->next) lst->last = prev; lst->count--; - SyStrFree(item->key); SyStrFree(item->value); SyStrFree(item->ustr); free(item); + SyKVListFreeItem(item); + return SY_TRUE; } diff --git a/src/syren_str.h b/src/syren_str.h index ea736fc..4b2b47c 100644 --- a/src/syren_str.h +++ b/src/syren_str.h @@ -62,6 +62,8 @@ typedef struct { TSyKVList *SyKVListNew (void); void SyKVListFree (TSyKVList *lst); void SyKVListClear (TSyKVList *lst); +void SyKVListClearItem (TSyKVListItem *item); +void SyKVListFreeItem (TSyKVListItem *item); TSyKVListItem *SyKVListFind (const TSyKVList *lst, const char *key); TSyResult SyKVListDelete (TSyKVList *lst, const char *key); TSyKVListItem *SyKVListSet (TSyKVList *lst, const char *key, const char *value, int *newKey); -- 2.11.4.GIT