-- 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;
}


Sign In
Create Account


Back to top









