Jump to content

Rocket library for C: Improves productivity!

- - - - -

  • Please log in to reply
No replies to this topic

#1
rocketboy9000

rocketboy9000

    Learning Programmer

  • Members
  • PipPipPip
  • 79 posts
This is a set of functions I collected from various programs I've written, which allow better handing in particular of:
-- Input: the lnscanf() "line scanf" family of functions, guaranteed to read exactly one line!
-- Strings: the dst***() "dynamic string" family of functions deals with malloc'd strings easily and quickly!
Without any further ado, here are the functions:
//rktlib.1.0.h

#define lambda(type,argsbody)\

	({type _name_ argsbody &_name_;})

#define lyda(type,body,args...)\

	({type _name_(args){return body;} &_name_;})

#define let(x,y) typeof(y) x=y

#define unless(x) if(!(x))

#define until(x) while(!(x))

#define sgn(x) (i>=0?1:-1)

#define sqr(x) ({let(y,x);y*y;})

#define swap(x,y) ({let(_xp_,&x);\

		let(_yp_,&y);\

		let(_z_,*_xp_);\

		*_xp_=*_yp_;\

		*_yp_=_z_;})


//line scanf - guaranteed to read one line

int fslnscanf(FILE *fl,char *line,int len,char const *format, ...);//reads one line into line, then interprets according to format

int flnscanf(FILE *fl,char const *format, ...);//reads one line and interprets

int slnscanf(char *line,int len,char const *format, ...);

int lnscanf(char const *format, ...);


//integer stringification.

// base cannot be 1.

const char * itoa(int n,int base);

const char * utoa(int i,unsigned base);

const char * utoroman(unsigned int i);

unsigned int atou(const char* s);//only does base 10


//dynamic strings

char * dstcpy(char const*s);//allocates new string and copies s into it

char * dstncpy(char const*s,int n);//allocates noew string and copies first n bytes of s into it

char * dstcat(char *s,char const*t);//resizes s to fit t.

char * dstxcat(char *s,char const *t,int n);//appends n copies of t to s

char * strbsp(char *s,int n);//backspace, does not assume s is dynamic

char * dstbsp(char *s,int n);//backspace, resizes s

char * fgetdst(FILE *fl);// get dynamic string from fl

char * getdst(void);//det dynamic string from standard in

char * dstins(char *s,int p,char const *t);//insert t into s at p, resizes s

char * dstdel(char *s,int p, int n);//removes n characters past p from s resizing s.

void strrev(char *s);//reverse s

void memswap(void *a,void *b,int n);//swap n bytes from a with b. a nd b cannot overlap.


//dynamic bignum library, deals with bignums in base 10

char * dstneg(char *s);//negate s as a number

int dstgel(char *a,char *b);//compare s as a number

char * dstadd(char *a,char *b);//add a to b, allocates new string for result

char * dstsub(char *a,char *b);//subtract b from a allocates new string.


//easy regexes

char *rxmatch(char *s,char *pat);//returns a dst copy of matching substring.

And here are the definitions:
//rktlib v1.0

#include "stdio.h"

#include "stdarg.h" 

#include "stdlib.h"

#include "rktlib.1.0.h"

#include "string.h"

#include "regex.h"


int fslnscanf(FILE *fl,char *line,int len,char const *format, ...){

	fgets(line,len,fl);

	va_list arglist;

	va_start(arglist,format);

	return vsscanf(line,format,arglist);

}


int flnscanf(FILE *fl,char const *format, ...){

	va_list arglist;

	va_start(arglist,format);

	int ret=vfscanf(fl,format,arglist);

	int c=1;

	while(c!='\n'&&c!=EOF)c=fgetc(fl);

	return ret;

}


int slnscanf(char *line,int len,char const *format, ...){

	fgets(line,len,stdin);

	va_list arglist;

	va_start(arglist,format);

	return vsscanf(line,format,arglist);

}


int lnscanf(char const *format, ...){

	va_list arglist;

	va_start(arglist,format);

	int ret=vscanf(format,arglist);

	char c=0;

	while(c!='\n'&&c!=EOF)c=getchar();

	return ret;

}


//note that base MUST NOT BE 1.

const char * itoa(int i,int base){

	static char s[34];

	char*t=s+32;

	int sgn;

	i/=sgn=sgn(i);

	do*t--="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\

abcdefghijklmnopqrstuvwxyz+/"[i%base];while(i/=base,i>0);

	if(sgn<0)*t='-';

	else++t;

	return t;

}


const char * utoa(int i,unsigned base){

	static char s[sizeof(unsigned)*8+1];

	char*t=s+sizeof(unsigned)*8;

	do*--t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\

abcdefghijklmnopqrstuvwxyz+/"[i%base];while(i/=base,i>0);

	return t;

}


//MMMDCCCLXXXVIII

const char * utoroman(unsigned int i){

	static char s[16];

	if(i>=4000)return "Magnus";

	if(i==0)return "Nihil";

	char *t=s+15;

	int m=0;

	do{

		switch(i%10){

		case 1 ... 3:

		case 6 ... 8:

			*--t="IXCM"[m];

			i--;

			continue;

		case 5:	*--t="VLD"[m];

			break;

		case 4:	*--t="VLD"[m];

		if(0)

		case 9:	*--t="XCM"[m];

			*--t="IXCM"[m];

		case 0: break;

		}

		m++;

		i/=10;

	}while(i>0);

	return t;

}


unsigned int atou(const char* s){

	unsigned int a=0;

	while(*s&&'0'>*s||*s>'9')s++;

	while(*s&&'0'<=*s||*s<='9'){

		a*=10;

		a+=*s-'0';

		s++;

	}

	return a;

}



//dynamic strings

char * dstcpy(char const*s){

	int i=strlen(s)+1;

	char *t=malloc(i);

	memcpy(t,s,i);

	return t;

}


char * dstncpy(char const*s, int n){

	char *t=malloc(n+1);

	memcpy(t,s,n);

	t[n]=0;

	return t;

}


char * dstcat(char *s,char const*t){

	if(!*t)return s;

	int i=strlen(s);

	int j=strlen(t);

	s=realloc(s,i+j+1);

	memcpy(s+i,t,j+1);

	return s;

}


char * dstxcat(char *s,const char *t,int n){

	while(n--)s=dstcat(s,t);

	return s;

}


char * strbsp(char *s,int n){

	int i=strlen(s);

	s[i-n]=0;

	return s;

}


char * dstbsp(char *s,int n){

	int i=strlen(s);

	s=realloc(s,i-n+1);

	s[i-n]=0;

	return s;

}


char * getdst(void){

	return fgetdst(stdin);

}


char * fgetdst(FILE *fl){

	char *s;

	int i=64;

	s=malloc(i);

	if(!fgets(s,i,fl))return 0;

	while(s[strlen(s)-1]!='\n'){

		i*=2;

		s=realloc(s,i);

		fgets(s+strlen(s),i-strlen(s),fl);

	}

	s[strlen(s)-1]=0;

	return s;

}


char * dstins(char *s,int p,char const *t){

	int i=strlen(s);

	int j=strlen(t);

	s=realloc(s,i+j+1);

	memcpy(s+p+j,s+p,i-p+1);

	memcpy(s+p,t,j);

	return s;

}


char * dstdel(char *s,int p, int n){

	int i=strlen(s);

	memcpy(s+p,s+p+n,i-p-n+1);

	s=realloc(s,i-n+1);

	return s;

}


void strrev(char *s){

	char *t=s+strlen(s)-1;

	while(t>s){

		int i=*t;

		*t=*s;

		*s=i;

		s++;

		t--;

	}

}


void memswap(void *v,void *w,int n){

	char c;

	int i;

	for(i=0;i<n;i++){

		c=((char*)v)[i];

		((char*)v)[i]=((char*)w)[i];

		((char*)w)[i]=c;

	}

}


//bignum library

char * dstneg(char *s){

	if(*s=='-') return dstdel(s,0,1);

	else return dstins(s,0,"-");

}


int dstgel(char *a,char *b){

	if(*a=='-'&&*b=='-')return dstgel(b+1,a+1);

	if(*a=='-')return -1;

	if(*b=='-')return 1;

	int i,n=strlen(a),m=strlen(b);

	if(n<m)return -1;

	if(m>n)return 1;

	for(i=0;i<m;i++)

		if(a[i]>b[i])return 1;

		else if(a[i]<b[i])return -1;

	return 0;

}


char * dstadd(char *a,char *b){

	if(*a=='-')return dstsub(b,a+1);

	if(*b=='-')return dstsub(a,b+1);

	int n=strlen(a),m=strlen(b);

	if(n<m)return dstadd(b,a);

	char c=0,*s=malloc(n+m+2);

	int i=n-1,j=m-1,k=0;

	while(j>=0){

		s[k]=(a[i]+b[j]+c-2*'0')%10+'0';

		c=(a[i]+b[j]+c-2*'0')/10;

		i--;j--;k++;

	}

	while(i>=0){

		s[k]=(a[i]+c-'0')%10+'0';

		c=(a[i]-'0'+c)/10;

		i--;k++;

	}

	if(c)s[k]=c+'0',k++;

	s[k]=0;

	strrev(s);

	return s;

}


char * dstsub(char *a,char *b){

	if(*a=='-')return dstneg(dstadd(b,a+1));

	if(*b=='-')return dstadd(a,b+1);

	int cmp=dstgel(a,b);

	if(cmp==0)return dstcpy("0");

	if(cmp==-1)return dstneg(dstsub(b,a));

	int n=strlen(a),m=strlen(b);

	char c=0,*s=malloc(n+m+2);

	int i=n-1,j=m-1,k=0;

	while(j>=0){

		int d=(a[i]-b[j]+c);

		if(d>=0)s[k]=d+'0',c=0;

		else s[k]=d+10+'0',c=-1;

		i--;j--;k++;

	}

	while(i>=0){

		int d=(a[i]+c);

		if(d>=0)s[k]=d+'0',c=0;

		else s[k]=d+10+'0',c=-1;

		i--;k++;

	}

	s[k]=0;

	for(j=strlen(s)-1;s[j]=='0';j--)s[j]=0;

	strrev(s);

	return s;

}


char *rxmatch(char *s,char *pat){//returns a dst copy of matching substring.

	regex_t rx;

	regmatch_t info;

	regcomp(&rx,pat,REG_EXTENDED);

	regexec(&rx,s,1,&info,0);

	regfree(&rx);

	int l=info.rm_eo-info.rm_so;

	char *res=dstncpy(s+info.rm_so,l);

	return res;

}







1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users