This is blocks.c in view mode; [Download] [Up]
/* Fast block move/copy subroutines Copyright (C) 1992 Joseph H. Allen This file is part of JOE (Joe's Own Editor) JOE is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. JOE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with JOE; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Take a look at the configuration information in config.h */ /* This module requires that AUTOINC, ALIGNED, ISIZ, SHFT and BITS be defined * correctly */ #include "blocks.h" /* Set 'sz' 'int's beginning at 'd' to the value 'c' */ /* Returns address of block. Does nothing if 'sz' equals zero */ int *msetI(d,c,sz) register int *d, c; register int sz; { int *orgd=d; while(sz>=16) { #ifdef AUTOINC *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; *d++=c; #else d[0]=c; d[1]=c; d[2]=c; d[3]=c; d[4]=c; d[5]=c; d[6]=c; d[7]=c; d[8]=c; d[9]=c; d[10]=c; d[11]=c; d[12]=c; d[13]=c; d[14]=c; d[15]=c; d+=16; #endif sz-=16; } switch(sz) { #ifdef AUTOINC case 15: *d++=c; case 14: *d++=c; case 13: *d++=c; case 12: *d++=c; case 11: *d++=c; case 10: *d++=c; case 9: *d++=c; case 8: *d++=c; case 7: *d++=c; case 6: *d++=c; case 5: *d++=c; case 4: *d++=c; case 3: *d++=c; case 2: *d++=c; case 1: *d++=c; #else case 15: d[14]=c; case 14: d[13]=c; case 13: d[12]=c; case 12: d[11]=c; case 11: d[10]=c; case 10: d[9]=c; case 9: d[8]=c; case 8: d[7]=c; case 7: d[6]=c; case 6: d[5]=c; case 5: d[4]=c; case 4: d[3]=c; case 3: d[2]=c; case 2: d[1]=c; case 1: d[0]=c; #endif case 0:; } return orgd; } /* Set 'sz' 'char's beginning at 'd' to the value 'c' */ /* Returns address of block. Does nothing if 'sz' equals zero */ char *mset(d,c,sz) register char *d; register unsigned char c; register int sz; { char *orgd=d; if(sz<16) switch(sz) { #ifdef AUTOINC case 15: *d++=c; case 14: *d++=c; case 13: *d++=c; case 12: *d++=c; case 11: *d++=c; case 10: *d++=c; case 9: *d++=c; case 8: *d++=c; case 7: *d++=c; case 6: *d++=c; case 5: *d++=c; case 4: *d++=c; case 3: *d++=c; case 2: *d++=c; case 1: *d++=c; #else case 15: d[14]=c; case 14: d[13]=c; case 13: d[12]=c; case 12: d[11]=c; case 11: d[10]=c; case 10: d[9]=c; case 9: d[8]=c; case 8: d[7]=c; case 7: d[6]=c; case 6: d[5]=c; case 5: d[4]=c; case 4: d[3]=c; case 3: d[2]=c; case 2: d[1]=c; case 1: d[0]=c; #endif case 0:; } else { int z=ISIZ-((int)d&(ISIZ-1)); if(z!=ISIZ) switch(z) { #ifdef AUTOINC case 7: *d++=c; case 6: *d++=c; case 5: *d++=c; case 4: *d++=c; case 3: *d++=c; case 2: *d++=c; case 1: *d++=c; case 0:; #else case 7: d[6]=c; case 6: d[5]=c; case 5: d[4]=c; case 4: d[3]=c; case 3: d[2]=c; case 2: d[1]=c; case 1: d[0]=c; case 0:; d+=z; #endif sz-=z; } msetI(d, #if ISIZ>=8 (c<<(BITS*7))+(c<<(BITS*6))+(c<<(BITS*5))+(c<<(BITS*4))+ #endif #if ISIZ>=4 (c<<(BITS*3))+(c<<(BITS*2))+ #endif #if ISIZ>=2 (c<<BITS)+ #endif c,sz>>SHFT); d+=sz&~(ISIZ-1); switch(sz&(ISIZ-1)) { #ifdef AUTOINC case 7: *d++=c; case 6: *d++=c; case 5: *d++=c; case 4: *d++=c; case 3: *d++=c; case 2: *d++=c; case 1: *d++=c; #else case 7: d[6]=c; case 6: d[5]=c; case 5: d[4]=c; case 4: d[3]=c; case 3: d[2]=c; case 2: d[1]=c; case 1: d[0]=c; #endif case 0:; } } return orgd; } /* Copy a block of integers */ /* Copy from highest address to lowest */ static int *mbkwdI(d,s,sz) register int *d, *s; register int sz; { if(d==s) return d; d+=sz; s+=sz; while(sz>=16) { #ifdef AUTOINC *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; #else d-=16; s-=16; d[15]=s[15]; d[14]=s[14]; d[13]=s[13]; d[12]=s[12]; d[11]=s[11]; d[10]=s[10]; d[9]=s[9]; d[8]=s[8]; d[7]=s[7]; d[6]=s[6]; d[5]=s[5]; d[4]=s[4]; d[3]=s[3]; d[2]=s[2]; d[1]=s[1]; d[0]=s[0]; #endif sz-=16; } #ifndef AUTOINC d-=sz; s-=sz; #endif switch(sz) { #ifdef AUTOINC case 15: *--d= *--s; case 14: *--d= *--s; case 13: *--d= *--s; case 12: *--d= *--s; case 11: *--d= *--s; case 10: *--d= *--s; case 9: *--d= *--s; case 8: *--d= *--s; case 7: *--d= *--s; case 6: *--d= *--s; case 5: *--d= *--s; case 4: *--d= *--s; case 3: *--d= *--s; case 2: *--d= *--s; case 1: *--d= *--s; #else case 15: d[14]=s[14]; case 14: d[13]=s[13]; case 13: d[12]=s[12]; case 12: d[11]=s[11]; case 11: d[10]=s[10]; case 10: d[9]=s[9]; case 9: d[8]=s[8]; case 8: d[7]=s[7]; case 7: d[6]=s[6]; case 6: d[5]=s[5]; case 5: d[4]=s[4]; case 4: d[3]=s[3]; case 3: d[2]=s[2]; case 2: d[1]=s[1]; case 1: d[0]=s[0]; #endif case 0:; } return d; } /* Copy a block of 'int's. Copy from lowest address to highest */ static int *mfwrdI(d,s,sz) register int *d, *s; register int sz; { int *od=d; if(s==d) return d; while(sz>=16) { #ifdef AUTOINC *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; #else d[0]=s[0]; d[1]=s[1]; d[2]=s[2]; d[3]=s[3]; d[4]=s[4]; d[5]=s[5]; d[6]=s[6]; d[7]=s[7]; d[8]=s[8]; d[9]=s[9]; d[10]=s[10]; d[11]=s[11]; d[12]=s[12]; d[13]=s[13]; d[14]=s[14]; d[15]=s[15]; s+=16; d+=16; #endif sz-=16; } #ifndef AUTOINC s-=15-sz; d-=15-sz; #endif switch(sz) { #ifdef AUTOINC case 15: *d++= *s++; case 14: *d++= *s++; case 13: *d++= *s++; case 12: *d++= *s++; case 11: *d++= *s++; case 10: *d++= *s++; case 9: *d++= *s++; case 8: *d++= *s++; case 7: *d++= *s++; case 6: *d++= *s++; case 5: *d++= *s++; case 4: *d++= *s++; case 3: *d++= *s++; case 2: *d++= *s++; case 1: *d++= *s++; #else case 15: d[0]=s[0]; case 14: d[1]=s[1]; case 13: d[2]=s[2]; case 12: d[3]=s[3]; case 11: d[4]=s[4]; case 10: d[5]=s[5]; case 9: d[6]=s[6]; case 8: d[7]=s[7]; case 7: d[8]=s[8]; case 6: d[9]=s[9]; case 5: d[10]=s[10]; case 4: d[11]=s[11]; case 3: d[12]=s[12]; case 2: d[13]=s[13]; case 1: d[14]=s[14]; #endif case 0:; } return od; } /* Copy the block of 'sz' bytes beginning at 's' to 'd'. If 'sz' is zero or * if 's'=='d', nothing happens. The bytes at the highest address ('s'+'sz'-1) * are copied before the ones at the lowest ('s') are. */ char *mbkwd(d,s,sz) register char *d, *s; register int sz; { if(s==d) return d; s+=sz; d+=sz; #ifdef ALIGNED if( sz>=16 ) #else if( ((int)s&(ISIZ-1))==((int)d&(ISIZ-1)) && sz>=16) #endif { int z=((int)s&(ISIZ-1)); #ifndef AUTOINC s-=z; d-=z; #endif switch(z) { #ifdef AUTOINC case 7: *--d= *--s; case 6: *--d= *--s; case 5: *--d= *--s; case 4: *--d= *--s; case 3: *--d= *--s; case 2: *--d= *--s; case 1: *--d= *--s; #else case 7: d[6]=s[6]; case 6: d[5]=s[5]; case 5: d[4]=s[4]; case 4: d[3]=s[3]; case 3: d[2]=s[2]; case 2: d[1]=s[1]; case 1: d[0]=s[0]; #endif case 0:; } sz-=z; mbkwdI(d-(sz&~(ISIZ-1)),s-(sz&~(ISIZ-1)),sz>>SHFT); #ifndef AUTOINC d-=sz; s-=sz; #else d-=(sz&~(ISIZ-1)); s-=(sz&~(ISIZ-1)); #endif switch(sz&(ISIZ-1)) { #ifdef AUTOINC case 7: *--d= *--s; case 6: *--d= *--s; case 5: *--d= *--s; case 4: *--d= *--s; case 3: *--d= *--s; case 2: *--d= *--s; case 1: *--d= *--s; #else case 7: d[6]=s[6]; case 6: d[5]=s[5]; case 5: d[4]=s[4]; case 4: d[3]=s[3]; case 3: d[2]=s[2]; case 2: d[1]=s[1]; case 1: d[0]=s[0]; #endif case 0:; } } else { while(sz>=16) { #ifdef AUTOINC *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; *--d= *--s; #else d-=16; s-=16; d[15]=s[15]; d[14]=s[14]; d[13]=s[13]; d[12]=s[12]; d[11]=s[11]; d[10]=s[10]; d[9]=s[9]; d[8]=s[8]; d[7]=s[7]; d[6]=s[6]; d[5]=s[5]; d[4]=s[4]; d[3]=s[3]; d[2]=s[2]; d[1]=s[1]; d[0]=s[0]; #endif sz-=16; } #ifndef AUTOINC d-=sz; s-=sz; #endif switch(sz) { #ifdef AUTOINC case 15: *--d= *--s; case 14: *--d= *--s; case 13: *--d= *--s; case 12: *--d= *--s; case 11: *--d= *--s; case 10: *--d= *--s; case 9: *--d= *--s; case 8: *--d= *--s; case 7: *--d= *--s; case 6: *--d= *--s; case 5: *--d= *--s; case 4: *--d= *--s; case 3: *--d= *--s; case 2: *--d= *--s; case 1: *--d= *--s; #else case 15: d[14]=s[14]; case 14: d[13]=s[13]; case 13: d[12]=s[12]; case 12: d[11]=s[11]; case 11: d[10]=s[10]; case 10: d[9]=s[9]; case 9: d[8]=s[8]; case 8: d[7]=s[7]; case 7: d[6]=s[6]; case 6: d[5]=s[5]; case 5: d[4]=s[4]; case 4: d[3]=s[3]; case 3: d[2]=s[2]; case 2: d[1]=s[1]; case 1: d[0]=s[0]; #endif case 0:; } } return d; } /* Copy the block of 'sz' bytes beginning at 's' to 'd'. If 'sz' is zero or * if 's'=='d', nothing happens. The bytes at the lowest address ('s') * are copied before the ones at the highest ('s'+'sz'-1) are. */ char *mfwrd(d,s,sz) register char *d, *s; register int sz; { char *od=d; if(d==s) return d; #ifdef ALIGNED if(sz>=16) #else if( ((int)d&(ISIZ-1))==((int)s&(ISIZ-1)) && sz>=16 ) #endif { int z=((int)s&(ISIZ-1)); if(z) { #ifndef AUTOINC s-=z; d-=z; switch(ISIZ-z) { #if ISIZ==8 case 7: d[1]=s[1]; case 6: d[2]=s[2]; case 5: d[3]=s[3]; case 4: d[4]=s[4]; case 3: d[5]=s[5]; case 2: d[6]=s[6]; case 1: d[7]=s[7]; case 0:; #else #if ISIZ==4 case 3: d[1]=s[1]; case 2: d[2]=s[2]; case 1: d[3]=s[3]; case 0:; #else #if ISIZ==2 case 1: d[1]=s[1]; case 0:; #endif #endif #endif } s+=ISIZ; d+=ISIZ; #else switch(ISIZ-z) { case 7: *d++= *s++; case 6: *d++= *s++; case 5: *d++= *s++; case 4: *d++= *s++; case 3: *d++= *s++; case 2: *d++= *s++; case 1: *d++= *s++; case 0:; } #endif sz-=ISIZ-z; } mfwrdI(d,s,sz>>SHFT); #ifdef AUTOINC s+=(sz&~(ISIZ-1)); d+=(sz&~(ISIZ-1)); switch(sz&(ISIZ-1)) { case 7: *d++= *s++; case 6: *d++= *s++; case 5: *d++= *s++; case 4: *d++= *s++; case 3: *d++= *s++; case 2: *d++= *s++; case 1: *d++= *s++; case 0:; } #else s+=sz-(ISIZ-1); d+=sz-(ISIZ-1); switch(sz&(ISIZ-1)) { #if ISIZ==8 case 7: d[0]=s[0]; case 6: d[1]=s[1]; case 5: d[2]=s[2]; case 4: d[3]=s[3]; case 3: d[4]=s[4]; case 2: d[5]=s[5]; case 1: d[6]=s[6]; case 0:; #else #if ISIZ==4 case 3: d[0]=s[0]; case 2: d[1]=s[1]; case 1: d[2]=s[2]; case 0:; #else #if ISIZ==2 case 1: d[0]=s[0]; case 0:; #endif #endif #endif } #endif } else { while(sz>=16) { #ifdef AUTOINC *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; *d++= *s++; #else d[0]=s[0]; d[1]=s[1]; d[2]=s[2]; d[3]=s[3]; d[4]=s[4]; d[5]=s[5]; d[6]=s[6]; d[7]=s[7]; d[8]=s[8]; d[9]=s[9]; d[10]=s[10]; d[11]=s[11]; d[12]=s[12]; d[13]=s[13]; d[14]=s[14]; d[15]=s[15]; s+=16; d+=16; #endif sz-=16; } #ifndef AUTOINC s-=15-sz; d-=15-sz; #endif switch(sz) { #ifdef AUTOINC case 15: *d++= *s++; case 14: *d++= *s++; case 13: *d++= *s++; case 12: *d++= *s++; case 11: *d++= *s++; case 10: *d++= *s++; case 9: *d++= *s++; case 8: *d++= *s++; case 7: *d++= *s++; case 6: *d++= *s++; case 5: *d++= *s++; case 4: *d++= *s++; case 3: *d++= *s++; case 2: *d++= *s++; case 1: *d++= *s++; case 0:; #else case 15: d[0]=s[0]; case 14: d[1]=s[1]; case 13: d[2]=s[2]; case 12: d[3]=s[3]; case 11: d[4]=s[4]; case 10: d[5]=s[5]; case 9: d[6]=s[6]; case 8: d[7]=s[7]; case 7: d[8]=s[8]; case 6: d[9]=s[9]; case 5: d[10]=s[10]; case 4: d[11]=s[11]; case 3: d[12]=s[12]; case 2: d[13]=s[13]; case 1: d[14]=s[14]; case 0:; #endif } } return od; } char *mmove(d,s,sz) char *d, *s; int sz; { if(d>s) mbkwd(d,s,sz); else mfwrd(d,s,sz); return d; } /* Utility to count number of lines within a segment */ int mcnt(blk,c,size) register char *blk,c; int size; { register int nlines=0; while(size>=16) { if(blk[0]==c) ++nlines; if(blk[1]==c) ++nlines; if(blk[2]==c) ++nlines; if(blk[3]==c) ++nlines; if(blk[4]==c) ++nlines; if(blk[5]==c) ++nlines; if(blk[6]==c) ++nlines; if(blk[7]==c) ++nlines; if(blk[8]==c) ++nlines; if(blk[9]==c) ++nlines; if(blk[10]==c) ++nlines; if(blk[11]==c) ++nlines; if(blk[12]==c) ++nlines; if(blk[13]==c) ++nlines; if(blk[14]==c) ++nlines; if(blk[15]==c) ++nlines; blk+=16; size-=16; } switch(size) { case 15: if(blk[14]==c) ++nlines; case 14: if(blk[13]==c) ++nlines; case 13: if(blk[12]==c) ++nlines; case 12: if(blk[11]==c) ++nlines; case 11: if(blk[10]==c) ++nlines; case 10: if(blk[9]==c) ++nlines; case 9: if(blk[8]==c) ++nlines; case 8: if(blk[7]==c) ++nlines; case 7: if(blk[6]==c) ++nlines; case 6: if(blk[5]==c) ++nlines; case 5: if(blk[4]==c) ++nlines; case 4: if(blk[3]==c) ++nlines; case 3: if(blk[2]==c) ++nlines; case 2: if(blk[1]==c) ++nlines; case 1: if(blk[0]==c) ++nlines; case 0:; } return nlines; } #ifdef junk char *mchr(blk,c) register char *blk, c; { loop: if(blk[0]==c) return blk+0; if(blk[1]==c) return blk+1; if(blk[2]==c) return blk+2; if(blk[3]==c) return blk+3; if(blk[4]==c) return blk+4; if(blk[5]==c) return blk+5; if(blk[6]==c) return blk+6; if(blk[7]==c) return blk+7; if(blk[8]==c) return blk+8; if(blk[9]==c) return blk+9; if(blk[10]==c) return blk+10; if(blk[11]==c) return blk+11; if(blk[12]==c) return blk+12; if(blk[13]==c) return blk+13; if(blk[14]==c) return blk+14; if(blk[15]==c) return blk+15; blk+=15; goto loop; } #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.