 void free_array_delimited(void** pp){
	if(pp==NULL) return;
	void** pi=pp;
	for(;*pi!=NULL;pi++) free(*pi);
	free(pp);
}
void free_array_unlimited(void** pp,int n){
	if(pp==NULL) return;
	void** pi=pp;
	for(;n>0;pi++,n--) free(*pi);
	free(pp);
}
void free_array_bounded(void** pp,int nmax){
	if(pp==NULL) return;
	void** pi=pp;
	for(;nmax>0 && *pi!=NULL;pi++,nmax--) free(*pi);
	free(pp);
}

void rompe(char* linea,char** palabras, ushort n, ushort* longitudes){
	char *c,*c2,*s;
	ushort i,j,lon;

	c=linea;
	for(i=0;i<n;i++){
		while(*c==' ' || *c=='\t') c++;
		if(*c==0) return;
		c2=c;
		while(*c2!=' ' && *c2!='\t' && *c2!=0) c2++;	//nombre
		s=palabras[i];
		lon=longitudes[i]-1;
		for(j=0;j<lon,c!=c2;j++)
			*(s++)=*(c++);
		*s=0;
		c=c2;
	}
}

void rompe_dinamico(char* linea,char** *palabras, int* t,ushort limitemaximo=3000){
	char *c,*c2,*s;
	ushort n;
	ushort j;
	ushort lon=0;
	ushort lc;
	if(limitemaximo>(short)0x7FFF) limitemaximo=(short)0x7FFF;
#define LLL 10

	(*palabras)=(char**)malloc(2*sizeof(char*));
	n=2;
	c=linea;
	for(*t=0;;){
		while(*c==' ' || *c=='\t'){
			c++;
			if(++lon>limitemaximo) return;
		}
		if(*c==0) return;
		c2=c;
		while(*c2!=' ' && *c2!='\t' && *c2!=0){
			c2++;
			if(++lon>limitemaximo) break;
		}
		if(*t==n){
			n<<=1;
			(*palabras)=(char**)realloc((*palabras),n*sizeof(char*));
		}
		(*palabras)[*t]=(char*)malloc(LLL*sizeof(char));
		s=(*palabras)[*t];
		lc=LLL;
		for(j=1;c!=c2;j++){	//Aumentamos 1 para dejar sitio al 0 final
			if(j==lc){
				lc<<=1;
				(*palabras)[*t]=(char*)realloc((*palabras)[*t],lc*sizeof(char));
				s=(*palabras)[*t]+j-1;
			}
			*(s++)=*(c++);
		}
		*s=0;
		(*t)++;
		c=c2;
	}
#undef LLL
}