/*
* Dolda Connect - Modular multiuser Direct Connect-style client
- * Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ * Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
-#include <malloc.h>
#include <wchar.h>
#include <wctype.h>
#include <errno.h>
#include "log.h"
#include "sysevents.h"
#include "filenet.h"
+#include "client.h"
#include "search.h"
#define TOK_STR 0
return(ln);
}
+static int wcsexists(wchar_t *h, wchar_t *n)
+{
+ size_t hl = wcslen(h), nl = wcslen(n);
+ wchar_t lh[hl + 1], ln[nl + 1];
+ int i;
+
+ for(i = 0; i <= hl; i++)
+ lh[i] = towlower(h[i]);
+ for(i = 0; i <= nl; i++)
+ ln[i] = towlower(n[i]);
+ return(wcsstr(lh, ln) != NULL);
+}
+
static void slmerge1(struct wcslist **list, wchar_t *str)
{
size_t len;
if(ret.begstr != NULL)
{
for(i = 0; (sinf.begstr[i] != L'\0') && (ret.begstr != L'\0') && (ret.begstr[i] == sinf.begstr[i]); i++);
- if(i == 0)
+ if(i == 0) {
free(ret.begstr);
- else
+ ret.begstr = NULL;
+ } else {
ret.begstr[i] = L'\0';
+ }
}
free(sinf.begstr);
} else {
maxlen = len1;
}
for(i = 1; (i <= minlen) && (ret.endstr[len1 - i] == sinf.endstr[len2 - i]); i++);
- if(i == 1)
+ if(i == 1) {
free(ret.endstr);
- else if(i <= maxlen)
+ ret.endstr = NULL;
+ } else if(i <= maxlen) {
wmemmove(ret.endstr, ret.endstr + (len1 - i) + 1, i);
+ }
}
free(sinf.endstr);
} else {
if(sexpr->d.s != NULL)
free(sexpr->d.s);
}
+ if(sexpr->op == SOP_HASHIS)
+ {
+ if(sexpr->d.hash != NULL)
+ freehash(sexpr->d.hash);
+ }
free(sexpr);
}
freetok(tok2);
putsexpr(sexpr);
done = 0;
+ } else if((st->type == TOK_STR) && !wcsncmp(st->d.str, L"H=", 2)) {
+ tok2 = poptok(&st);
+ pushtok(tok = newtok(), &st);
+ tok->type = TOK_SE;
+ sexpr = newsexpr();
+ sexpr->op = SOP_HASHIS;
+ if((sexpr->d.hash = parsehash(tok2->d.str + 2)) == NULL)
+ {
+ freetok(tok2);
+ putsexpr(sexpr);
+ goto out_err;
+ }
+ sexpr->cost = 2;
+ getsexpr(tok->d.se = sexpr);
+ freetok(tok2);
+ putsexpr(sexpr);
+ done = 0;
} else if((std >= 3) && (st->type == TOK_CP) && (st->next->type == TOK_SE) && (st->next->next->type == TOK_OP)) {
freetok(poptok(&st));
tok = poptok(&st);
freesl(&l1);
freesl(&l2);
break;
- case SOP_NOT:
- break;
case SOP_NAMERE:
case SOP_LINKRE:
list = regexfindstrings(sexpr->d.re.sre);
free(buf);
return(!ret);
case SOP_LINKRE:
- p = sr->filename;
- if(sr->fnet->filebasename != NULL)
- p = sr->fnet->filebasename(p);
+ p = fnfilebasename(sr->filename);
if((buf = icwcstombs(p, "UTF-8")) == NULL)
return(0);
ret = regexec(&sexpr->d.re.cre, buf, 0, NULL, 0);
case SOP_NAMESS:
return(wcsexists(sr->filename, sexpr->d.s));
case SOP_LINKSS:
- p = sr->filename;
- if(sr->fnet->filebasename != NULL)
- p = sr->fnet->filebasename(p);
+ p = fnfilebasename(sr->filename);
return(wcsexists(p, sexpr->d.s));
case SOP_SIZELT:
return(sr->size < sexpr->d.n);
return(sr->size == sexpr->d.n);
case SOP_SIZEGT:
return(sr->size > sexpr->d.n);
+ case SOP_HASHIS:
+ if(sr->hash == NULL)
+ return(0);
+ return(hashcmp(sr->hash, sexpr->d.hash));
}
return(0);
}
sr->srch->results = sr->next;
sr->srch->numres--;
}
+ if(sr->hash != NULL)
+ freehash(sr->hash);
if(sr->filename != NULL)
free(sr->filename);
if(sr->peerid != NULL)
new->filename = swcsdup(sr->filename);
if(sr->fn != NULL)
getfnetnode(new->fn = sr->fn);
+ if(sr->hash != NULL)
+ new->hash = duphash(sr->hash);
return(new);
}