Lines Matching refs:jp
167 done(register Join_t* jp) in done() argument
169 if (jp->file[0].iop && jp->file[0].iop != sfstdin) in done()
170 sfclose(jp->file[0].iop); in done()
171 if (jp->file[1].iop && jp->file[1].iop != sfstdin) in done()
172 sfclose(jp->file[1].iop); in done()
173 if (jp->outlist) in done()
174 free(jp->outlist); in done()
175 if (jp->file[0].fields) in done()
176 free(jp->file[0].fields); in done()
177 if (jp->file[1].fields) in done()
178 free(jp->file[1].fields); in done()
179 if (jp->same) in done()
180 free(jp->same); in done()
181 free(jp); in done()
187 register Join_t* jp; in init() local
191 if (jp = newof(0, Join_t, 1, 0)) in init()
193 if (jp->mb = mbwide()) in init()
195 jp->state[i] = S_WIDE; in init()
196 jp->state[' '] = jp->state['\t'] = S_SPACE; in init()
197 jp->state['\n'] = S_NL; in init()
198 jp->delim = -1; in init()
199 jp->nullfield = 0; in init()
200 if (!(jp->file[0].fields = newof(0, Field_t, NFIELD + 1, 0)) || in init()
201 !(jp->file[1].fields = newof(0, Field_t, NFIELD + 1, 0))) in init()
203 done(jp); in init()
206 jp->file[0].maxfields = NFIELD; in init()
207 jp->file[1].maxfields = NFIELD; in init()
208 jp->outmode = C_COMMON; in init()
210 return jp; in init()
214 getolist(Join_t* jp, const char* first, char** arglist) in getolist() argument
224 outptr = jp->outlist = newof(0, int, NFIELD + 1, 0); in getolist()
249 jp->outlist = newof(jp->outlist, int, 2 * nfield + 1, 0); in getolist()
250 outptr = jp->outlist + nfield; in getolist()
252 outmax = jp->outlist + nfield; in getolist()
280 jp->outlist = newof(jp->outlist, int, 2 * nfield + 1, 0); in getolist()
281 outptr = jp->outlist + nfield; in getolist()
283 outmax = jp->outlist + nfield; in getolist()
295 getrec(Join_t* jp, int index, int discard) in getrec() argument
297 register unsigned char* sp = jp->state; in getrec()
298 register File_t* fp = &jp->file[index]; in getrec()
305 if (sh_checksig(jp->context)) in getrec()
313 jp->outmode &= ~(1<<index); in getrec()
318 if (jp->delim == '\n') /* handle new-line delimiter specially */ in getrec()
337 if (jp->delim == -1) in getrec()
356 if (jp->mb) in getrec()
379 if (jp->mb) in getrec()
391 if (n == jp->delim) in getrec()
396 if (jp->delim == -1 && iswspace(n)) in getrec()
421 if (jp->mb) in getrec()
451 _trace_getrec(Join_t* jp, int index, int discard) in _trace_getrec() argument
455 r = getrec(jp, index, discard); in _trace_getrec()
469 outfield(Join_t* jp, int index, register int n, int last) in outfield() argument
471 register File_t* fp = &jp->file[index]; in outfield()
475 register Sfio_t* iop = jp->outfile; in outfield()
485 if ((n = jp->delim) == -1) in outfield()
489 register unsigned char* sp = jp->state; in outfield()
492 if (jp->mb) in outfield()
516 else if (jp->delimstr) in outfield()
528 if (jp->nullfield && sfputr(iop, jp->nullfield, -1) < 0) in outfield()
533 if (sfwrite(iop, jp->delimstr, jp->delimlen) < 0) in outfield()
538 if (!jp->nullfield) in outfield()
540 else if (sfputr(iop, jp->nullfield, n) < 0) in outfield()
560 outrec(register Join_t* jp, int mode) in outrec() argument
569 if (mode < 0 && jp->file[0].hit++) in outrec()
571 if (mode > 0 && jp->file[1].hit++) in outrec()
573 if (out = jp->outlist) in outrec()
580 j = jp->file[i].field; in outrec()
586 jp->file[i].nfields : in outrec()
589 if (outfield(jp, i, j, *out < 0) < 0) in outrec()
594 k = jp->file[0].nfields; in outrec()
596 k += jp->file[1].nfields - 1; in outrec()
599 fp = &jp->file[i]; in outrec()
609 if (outfield(jp,i,n,!--k) < 0) in outrec()
615 if (outfield(jp,i,j,!--k) < 0) in outrec()
626 if (j!=n && outfield(jp,i,j,!--k) < 0) in outrec()
636 …d}:%-.*s{%d}]", __LINE__, i1=n, lo, hi, jp->file[0].fieldlen, cp1, jp->file[0].hit, jp->file[1].fi…
640 join(Join_t* jp) in join() argument
653 if ((cp1 = getrec(jp, 0, 0)) && (cp2 = getrec(jp, 1, 0)) || (cp2 = 0)) in join()
655 n1 = jp->file[0].fieldlen; in join()
656 n2 = jp->file[1].fieldlen; in join()
662 …if (!n && !(cmp = n1 < n2 ? -1 : (n1 > n2)) || n && !(cmp = (int)*cp1 - (int)*cp2) && !(cmp = jp->… in join()
664 sfprintf(sfstdout, "[C#%d:%d(%c-%c),%d,%lld,%lld%s]", __LINE__, cmp, *cp1, *cp2, same, lo, hi, (jp-… in join()
667 …if (!n && !(cmp = n1 < n2 ? -1 : (n1 > n2)) || n && !(cmp = (int)*cp1 - (int)*cp2) && !(cmp = jp->… in join()
670 if (!(jp->outmode & C_COMMON)) in join()
672 if (cp1 = getrec(jp, 0, 1)) in join()
674 n1 = jp->file[0].fieldlen; in join()
678 if ((jp->ooutmode & (C_FILE1|C_FILE2)) != C_FILE2) in join()
680 …if (sfseek(jp->file[0].iop, (Sfoff_t)-jp->file[0].reclen, SEEK_CUR) < 0 || !(cp1 = getrec(jp, 0, 0… in join()
682 error(ERROR_SYSTEM|2, "%s: seek error", jp->file[0].name); in join()
686 else if (outrec(jp, 0) < 0) in join()
688 else if (lo < 0 && (jp->outmode & C_COMMON)) in join()
690 if ((lo = sfseek(jp->file[1].iop, (Sfoff_t)0, SEEK_CUR)) < 0) in join()
692 error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); in join()
695 lo -= jp->file[1].reclen; in join()
697 if (cp2 = getrec(jp, 1, lo < 0)) in join()
699 n2 = jp->file[1].fieldlen; in join()
712 if (n2 > jp->samesize) in join()
714 jp->samesize = roundof(n2, 16); in join()
715 if (!(jp->same = newof(jp->same, char, jp->samesize, 0))) in join()
721 memcpy(jp->same, cp2, o2 = n2); in join()
722 if (!(cp2 = getrec(jp, 1, 0))) in join()
724 n2 = jp->file[1].fieldlen; in join()
725 if (n2 == o2 && *cp2 == *jp->same && !memcmp(cp2, jp->same, n2)) in join()
731 if (sfseek(jp->file[1].iop, hi, SEEK_SET) != hi) in join()
733 error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); in join()
738 else if ((jp->outmode & C_FILE2) && outrec(jp, 1) < 0) in join()
741 if (cp2 = getrec(jp, 1, 1)) in join()
743 n2 = jp->file[1].fieldlen; in join()
753 if (!(cp1 = getrec(jp, 0, 0))) in join()
755 n1 = jp->file[0].fieldlen; in join()
760 if ((hi = sfseek(jp->file[1].iop, (Sfoff_t)0, SEEK_CUR)) < 0 || in join()
761 (hi -= jp->file[1].reclen) < 0 || in join()
762 sfseek(jp->file[1].iop, lo, SEEK_SET) != lo || in join()
763 !(cp2 = getrec(jp, 1, 0))) in join()
765 error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); in join()
768 n2 = jp->file[1].fieldlen; in join()
770 if (jp->file[1].discard) in join()
771 sfseek(jp->file[1].iop, (Sfoff_t)-1, SEEK_SET); in join()
775 else if ((jp->outmode & C_FILE1) && outrec(jp, -1) < 0) in join()
777 if (!(cp1 = getrec(jp, 0, 1))) in join()
779 n1 = jp->file[0].fieldlen; in join()
783 sfprintf(sfstdout, "[X#%d:?,%p,%p,%d%,%d,%d%s]", __LINE__, cp1, cp2, cmp, lo, hi, (jp->outmode & C_… in join()
788 sfseek(jp->file[1].iop, (Sfoff_t)0, SEEK_CUR) < hi && in join()
789 sfseek(jp->file[1].iop, hi, SEEK_SET) != hi) in join()
791 error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); in join()
795 sfprintf(sfstdout, "[O#%d:%02o:%02o]", __LINE__, jp->ooutmode, jp->outmode); in join()
797 …cp1 = (!cp1 && cmp && hi < 0 && !jp->file[1].hit && ((jp->ooutmode ^ C_ALL) <= 1 || jp->outmode ==… in join()
807 …[X#%d:%d,%p,%p,%d,%02o,%02o%s]", __LINE__, n, cp1, cp2, cmp, jp->ooutmode, jp->outmode, (jp->outmo… in join()
809 if (!cp1 || !(jp->outmode & (1<<n))) in join()
811 if (cp1 && jp->file[n].iop == sfstdin) in join()
815 if (outrec(jp, cmp) < 0) in join()
819 if (!getrec(jp, n, 1)) in join()
821 } while (outrec(jp, cmp) >= 0); in join()
830 register Join_t* jp; in b_join() local
836 if (!(jp = init())) in b_join()
838 jp->context = context; in b_join()
878 jp->file[0].field = (int)(opt_info.num-1); in b_join()
886 jp->file[n-'1'].field = (int)(opt_info.num-1); in b_join()
889 jp->outmode &= ~C_COMMON; in b_join()
894 jp->outmode |= 1<<(opt_info.num-1); in b_join()
897 jp->nullfield = opt_info.arg; in b_join()
901 n = getolist(jp, opt_info.arg, argv+opt_info.index); in b_join()
905 jp->state[' '] = jp->state['\t'] = 0; in b_join()
906 if (jp->mb) in b_join()
909 jp->delim = mbchar(cp); in b_join()
912 jp->delimlen = n; in b_join()
913 jp->delimstr = opt_info.arg; in b_join()
918 jp->state[n] = S_DELIM; in b_join()
919 jp->delim = n; in b_join()
922 jp->ignorecase = !opt_info.num; in b_join()
925 jp->buffered = !opt_info.num; in b_join()
931 done(jp); in b_join()
941 done(jp); in b_join()
944 jp->ooutmode = jp->outmode; in b_join()
945 jp->file[0].name = cp = *argv++; in b_join()
953 jp->file[0].discard = 1; in b_join()
955 jp->file[0].iop = sfstdin; in b_join()
957 else if (!(jp->file[0].iop = sfopen(NiL, cp, "r"))) in b_join()
959 done(jp); in b_join()
962 jp->file[1].name = cp = *argv; in b_join()
970 jp->file[1].discard = 1; in b_join()
972 jp->file[1].iop = sfstdin; in b_join()
974 else if (!(jp->file[1].iop = sfopen(NiL, cp, "r"))) in b_join()
976 done(jp); in b_join()
979 if (jp->buffered) in b_join()
981 sfsetbuf(jp->file[0].iop, jp->file[0].iop, SF_UNBOUND); in b_join()
982 sfsetbuf(jp->file[1].iop, jp->file[1].iop, SF_UNBOUND); in b_join()
984 jp->outfile = sfstdout; in b_join()
985 if (!jp->outlist) in b_join()
986 jp->nullfield = 0; in b_join()
987 if (join(jp) < 0) in b_join()
989 done(jp); in b_join()
992 else if (jp->file[0].iop==sfstdin || jp->file[1].iop==sfstdin) in b_join()
994 done(jp); in b_join()