2 do_sort(TARG,arg,gimme,arglast)
8 register STR **st = stack->ary_array;
11 register int max = arglast[2] - sp;
21 if (gimme != G_ARRAY) {
22 str_sset(TARG,&str_undef);
29 st += sp; /* temporarily make st point to args */
30 for (i = 1; i <= max; i++) {
36 (*up)->str_pok &= ~SP_TEMP;
46 if (arg[1].arg_type == (A_CMD|A_DONT)) {
47 sortcmd = arg[1].arg_ptr.arg_cmd;
48 stash = curcmd->c_stash;
51 if ((arg[1].arg_type & A_MASK) == A_WORD)
52 stab = arg[1].arg_ptr.arg_stab;
54 stab = stabent(str_get(sortsubvar),TRUE);
57 if (!stab_sub(stab) || !(sortcmd = stab_sub(stab)->cmd))
58 fatal("Undefined subroutine \"%s\" in sort",
60 stash = stab_estash(stab);
67 int oldtmps_base = tmps_base;
70 sortstack = anew(Nullstab);
71 astore(sortstack, 0, Nullstr);
73 sortstack->ary_flags = 0;
78 if (sortstash != stash) {
79 firststab = stabent("a",TRUE);
80 secondstab = stabent("b",TRUE);
83 oldfirst = stab_val(firststab);
84 oldsecond = stab_val(secondstab);
86 qsort((char*)(st+sp+1),max,sizeof(STR*),sortsub);
88 qsort(Nullch,max,sizeof(STR*),sortsub);
90 stab_val(firststab) = oldfirst;
91 stab_val(secondstab) = oldsecond;
92 tmps_base = oldtmps_base;
97 qsort((char*)(st+sp+1),max,sizeof(STR*),sortcmp);