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); }
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; }