Ejemplo n.º 1
0
static int arraysort(const char *s1, const char *s2)
{
	struct Sort *sp = Sp;
	Shell_t	*shp = sp->shp;
	int r=0, cur=sp->cur;
	Namval_t *np1, *np2;
	Namfun_t	fun;
	char		*cp;
	memset(&fun,0,sizeof(Namfun_t));
	if(!(np1 = ((struct Node*)s1)->nodes[sp->cur]))
	{
		sfprintf(shp->strbuf,"%s[%i].%s%c",sp->name,((struct Node*)s1)->index,sp->keys[sp->cur],0);
		cp = sfstruse(shp->strbuf);
		np1 = nv_create(cp,sp->root,NV_VARNAME|NV_NOFAIL|NV_NOADD|NV_NOSCOPE,&fun);
		((struct Node*)s1)->nodes[sp->cur] = np1;
	}
	if(!(np2 = ((struct Node*)s2)->nodes[sp->cur]))
	{
		sfprintf( shp->strbuf,"%s[%i].%s%c",sp->name,((struct Node*)s2)->index,sp->keys[sp->cur],0);
		cp = sfstruse(shp->strbuf);
		np2 = nv_create(cp,sp->root,NV_VARNAME|NV_NOFAIL|NV_NOADD|NV_NOSCOPE,&fun);
		((struct Node*)s2)->nodes[sp->cur] = np2;
	}
	if(sp->flags[sp->cur]&SORT_numeric)
	{
		Sfdouble_t d1 = np1?nv_getnum(np1):0;
		Sfdouble_t d2 = np2?nv_getnum(np2):0;
		if(d2<d1)
			r = 1;
		else if(d2>d1)
			r = -1;
	}
	else if(np1 && np2)
	{
		char *sp1 = nv_getval(np1);
		char *sp2 = nv_getval(np2);
		r = strcoll(sp1,sp2);
		
	}
	else if(np1)
		r = 1;
	else if(np2)
		r = -1;
	if(sp->flags[sp->cur]&SORT_reverse)
		r = -r;
	if(r==0 && sp->keys[++sp->cur])
		r = arraysort(s1,s2);
	sp->cur = cur;
	return(r);
}
Ejemplo n.º 2
0
Archivo: args.c Proyecto: att/ast
static_fn int numsort(const char *s1, const char *s2) {
    struct Sort *sp = Sp;
    Sfdouble_t d1, d2;
    int r = 0;

    nv_putsub(sp->np, NULL, ((struct Node *)s1)->index, 0);
    d1 = nv_getnum(sp->np);
    nv_putsub(sp->np, NULL, ((struct Node *)s2)->index, 0);
    d2 = nv_getnum(sp->np);
    if (d2 < d1) {
        r = 1;
    } else if (d2 > d1) {
        r = -1;
    }
    if (sp->flags[0] & SORT_reverse) r = -r;
    return r;
}