Advertisement
mmmmkkkkzzzz

Untitled

May 28th, 2025
577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.09 KB | None | 0 0
  1. typedef unsigned char uint8_t;
  2. #define bGrow(from) ((unsigned)(((from)*1.2)+(3<<2>>1)))
  3. typedef signed int32_t;
  4. #define break(x) {x;break;}
  5. #define bMin(a,b) (((a)<(b))?(a):(b))
  6. #define UINT32_MAX 4294967295
  7. #define bCollate(l,r) ((l)<(r)?-1:(l)>(r)?1:0)
  8. #define bMax(a,b) (((a)>(b))?(a):(b))
  9. typedef unsigned uint32_t;
  10. typedef struct bColor{uint8_t r,g,b,a;}bColor;
  11. typedef struct bString{unsigned size,capacity;unsigned char* data;}bString;
  12. int bStringReplaceC(bString *bs,char *from,char *to);
  13. bColor bColorFromRGB(uint8_t r,uint8_t g,uint8_t b);
  14. bString bStringFrom(char *c,unsigned len);
  15. void bStringFree(bString *bs);
  16. bColor bColorFromSVG(char *color){
  17.  bString bs=bStringFrom(color,0);
  18.  bColor ret={.a=255};
  19.  if(bs.size==0)return ret;
  20.  unsigned num=0,next=0,i,j=24,x1,x2;
  21.  uint32_t clr[]={4176505121,4285342207,1847818912,619114746,32828,16738084,425993727,1847947289,637206517
  22.   ,3789881203,3674169639,3446810553,1680359301,672351627,1621423214,2147492137,2959419776,1730797252,
  23.   697335920,2424336487,4126503721,4278200821,908787711,707972506,16776960,2289510701,1999187353,707631496
  24.   ,769720319,2431553590,3635241517,4200869350,1731056378,768857043,3553874791,3070193709,1713647297,
  25.   1680845517,790859371,8421376,1174368816,4278202368,909181093,825412914,16711680,25394,4285411840,
  26.   976473579,871262331,3439329378,1438281523,2473604051,1949555568,869060936,2232797046,4293946932,
  27.   4285805808,741717097,905310463,4209436160,4289538614,13871,557252736,930780905,2411499374,2163239992,
  28.   3766040704,1866072063,972749567,1468739072,1516896314,3161668813,2034012047,1038182721,760389733,
  29.   3233836093,4284563136,2034150878,1635778560,3573514020,3959058017,4034552279,6422527,1660944128,
  30.   707437884,4126500194,4285096668,1969407204,1653061854,3794504310,98,3526648831,1029906025,1675426047,
  31.   2694733665,2506384995,2137547757,1818427647,1666220031,1008000114,4278221155,3664078079,1768169637,
  32.   1684629865,1768515945,2417913700,4278215935,912589015,1704524696,2867392100,4004476005,3681969646,
  33.   1768330096,1713513138,4042981228,2334289766,4285883938,879230720,1744828664,3705461857,2155901543,
  34.   2154981248,1634304128,1767660749,2181057383,3007082089,7367025,1986632442,1810956287,2332068644,
  35.   1328490859,791243599,795561807,1798269781,9240368,1677735531,1211788032,1651215165,1804271616,
  36.   2341142627,2260231275,2842127115,1735109033,1806281129,2363945064,3082644331,2574216043,1919667250,
  37.   1795162251,3519938676,9729643,2272881619,1634532046,1812003964,3455778661,3841945453,536899253,
  38.   1819257522,1877407229,3597720178,4026491248,4285100245,1819331520,1893572829,3873484911,352284784,
  39.   7565459,1970339775,1920991360,65381,2163876211,1177121650,1702081666,1945040383,3956180843,4278218867,
  40.   3529602175,1752468660,1960361944,1197735791,3762320756,3999889104,1752690306,11788021};
  41.  uint8_t pass1[]="darligmedslalavyelreeaqudeeoraornpaleagumsgololindiluehtswhinde",c[4]={0},r[2]={0};
  42.  uint8_t p2[]="allolimamingpesate\"w#mblhtiuve&e+e,a.mhoergnks-csn)bnarosi;v",*b=(uint8_t*)&clr,*d;
  43.  for(i=0;i<63;i+=3)c[0]=pass1[i],c[1]=pass1[i+1],c[2]=pass1[i+2],bStringReplaceC(&bs,c,"");d=bs.data;
  44.  for(i=0,j='!',c[2]=0;i<'<';j++,i+=2)c[0]=p2[i],c[1]=p2[i+1],r[0]=(char)j,bStringReplaceC(&bs,c,r);
  45.  for(i=0;i<735;i+=5)if(b[i]==d[0]&&b[i+1]==d[1])break(ret=bColorFromRGB(b[i+2],b[i+3],b[i+4]));
  46.  bStringFree(&bs);
  47.  return ret;
  48. }
  49. void *realloc(void *memory,size_t size);
  50. void *memset(void *dest,int val,size_t size);
  51. size_t strlen(const char *str);
  52. void *memmove(void *dest,const void *src,size_t size);
  53. void *memcpy(void *dest,const void *src,size_t size);
  54. void free(void *memory);
  55. #define bAddU32Ovflo(a,b) ((a)>UINT32_MAX-(b))
  56. #define ARRAY_EXTRA 3
  57. int bStringSetCapacity(bString *bs,unsigned capacity){
  58.  void *r=bAddU32Ovflo(capacity,ARRAY_EXTRA)?0:realloc(bs->data,(bs->capacity=capacity)+ARRAY_EXTRA);
  59.  return r?(memset((bs->data=(uint8_t*)r)+(bs->size),0,ARRAY_EXTRA)!=0):(bs->capacity=(unsigned)-2,0);
  60. }
  61. unsigned bStrlen(char *str){return str?(unsigned)strlen(str):0;}
  62. bString bStringFrom(char *c,unsigned len){
  63.  bString bs={0};
  64.  bStringSetCapacity(&bs,len||!c?len:(len=(unsigned)bStrlen(c)));
  65.  if(bs.capacity!=(unsigned)-2){
  66.   if(c&&(bs.data&&len>0)&&bs.capacity>=len)memcpy(bs.data,c,len);
  67.   if(len>0&&c)memset(bs.data+(bs.size=len),0,ARRAY_EXTRA);
  68.  }
  69.  return bs;
  70. }
  71. void bStringFree(bString *bs){
  72.  if(bs->capacity!=(unsigned)-1)free(bs->data);
  73.  memset(bs,0,sizeof(*bs));
  74. }
  75. #define bDECLARE_ARRAY(name,type)\
  76.  typedef struct name{unsigned size,capacity;type *data;}name;\
  77.  void name##Free(name *array);\
  78.  void name##SetCapacity(name *array,unsigned capacity);\
  79.  void name##Reserve(name *array,unsigned capacity);\
  80.  void name##Add(name *array,type value);\
  81.  void name##Insert(name *array,type value,unsigned index,unsigned amount);\
  82.  void name##Remove(name *array,unsigned index,unsigned amount);\
  83.  unsigned name##Find(name array,type value);\
  84.  unsigned name##FindLowerBound(name array,type value);
  85. #define bDEFINE_ARRAY(name,type,freefunc,collator)\
  86.  void name##Free(name *array){\
  87.   for(unsigned i=0;i<array->size;i++)freefunc(array->data+i);\
  88.   free(array->data);\
  89.   memset(array,0,sizeof(*array));\
  90.  }\
  91.  void name##SetCapacity(name *array,unsigned capacity){\
  92.   void *r=realloc(array->data,(((array->capacity=capacity)+ARRAY_EXTRA)*sizeof(type)));\
  93.   if(r)array->data=r;\
  94.   else array->capacity=(unsigned)-2;\
  95.  }\
  96.  void name##Reserve(name *array,unsigned capacity){\
  97.   if(capacity>array->capacity)name##SetCapacity(array,bGrow(capacity));\
  98.  }\
  99.  void name##Add(name *array,type value){\
  100.   name##Reserve(array,array->size+1);\
  101.   if(array->capacity!=(unsigned)-2)array->data[array->size++]=value;\
  102.  }
  103. void bFreeDefault(void *v){}
  104. int bCollateUint32(uint32_t *l,uint32_t *r){return bCollate(*l,*r);}
  105. bDECLARE_ARRAY(bArrayUint,uint32_t);
  106. bDEFINE_ARRAY(bArrayUint,uint32_t,bFreeDefault,bCollateUint32);
  107. const uint8_t bUpperToLower[256]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,
  108.  27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61
  109.  ,62,63,64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,
  110.  121,122,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,
  111.  117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,
  112.  143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,
  113.  169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,
  114.  195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
  115.  221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,
  116.  247,248,249,250,251,252,253,254,255};
  117. #define bLower(x) (bUpperToLower[(unsigned char)(x)])
  118. #if defined _MSC_VER
  119. typedef __unaligned uint32_t bUnaligned32;
  120. #else
  121. typedef uint32_t bUnaligned32 __attribute__((aligned(1),may_alias));
  122. #endif
  123. unsigned bStringFindChar(bString bs,char c,unsigned from,int ignoreCase,int reverse){
  124.  if(ignoreCase)c=bLower(c);
  125.  if(reverse){
  126.   for(unsigned i=bMin(from,bs.size-1);i<bs.size;i--)
  127.    if((ignoreCase?(bLower(bs.data[i])):(bs.data[i]))==c)return i;
  128.   return (unsigned)-1;
  129.  }
  130.  unsigned ret=(unsigned)-1;
  131.  if(ignoreCase){
  132.   for(unsigned i=from,s;i<bs.size&&ret==-1;i+=4){
  133.    s=*((bUnaligned32*)((char*)bs.data+i));
  134.    if(bLower(((s&255)))==c)ret=i;
  135.    else if(bLower(((s&65280)>>8))==c)ret=i+1;
  136.    else if(bLower(((s&16711680)>>16))==c)ret=i+2;
  137.    else if(bLower(((s&4278190080)>>24))==c)ret=i+3;
  138.   }
  139.  }else{
  140.   for(unsigned i=from,s,cc=(unsigned)c;i<bs.size&&ret==-1;i+=4){
  141.    s=*((bUnaligned32*)((char*)bs.data+i));
  142.    if(((s&255))==cc)ret=i;
  143.    else if(((s&65280)>>8)==cc)ret=i+1;
  144.    else if(((s&16711680)>>16)==cc)ret=i+2;
  145.    else if(((s&4278190080)>>24)==cc)ret=i+3;
  146.   }
  147.  }
  148.  return ret<bs.size?ret:(unsigned)-1;
  149. }
  150. bString bStringStatic(char *c,unsigned len){
  151.  return (bString){len==0?bStrlen(c):len,(unsigned)-1,(unsigned char*)c};
  152. }
  153. int bCollateStringAscii(bString *l,bString *r){
  154.  for(unsigned c,i=0,j=0;i<l->size&&j<r->size;i++,j++)if((c=(l->data[i]-r->data[j]))!=0)return c;
  155.  return l->size<r->size?-1:l->size>r->size?1:0;
  156. }
  157. int bCollateStringFast(bString *l,bString *r){
  158.  int coll=bCollateUint32(&l->size,&r->size);
  159.  return coll==0?bCollateStringAscii(l,r):coll;
  160. }
  161. unsigned lower32(uint32_t c){
  162.  union {uint32_t u;char ch[4];}u={.u=c};
  163.  for(unsigned i=0;i<4;i++)u.ch[i]=bLower(u.ch[i]);
  164.  return u.u;
  165. }
  166. typedef unsigned short uint16_t;
  167. unsigned bStringFind(bString bs,bString find,unsigned from,int ignoreCase){
  168.  if(bs.size==0||from+find.size>bs.size)return (unsigned)-1;
  169.  if(find.size==1)return bStringFindChar(bs,find.data[0],from,ignoreCase,0);
  170.  if(find.size==2||find.size==3){
  171.   uint16_t s=ignoreCase?((bLower(find.data[0]))|((bLower(find.data[1]))<<8))
  172.    :(find.data[0]|find.data[1]<<8);
  173.   for(unsigned i=from,n=(unsigned)-1,p;i<bs.size;i+=3){
  174.    bUnaligned32 t=*(bUnaligned32*)((char*)bs.data+i);
  175.    if(ignoreCase)t=lower32(t);
  176.    if((t&65535)==s)p=0;
  177.    else if(((t&16776960)>>8)==s)p=1;
  178.    else if(((t&4294967040)>>16)==s)p=2;
  179.    else continue;
  180.    if(find.size==2)return (i+p+find.size)<=bs.size?(i+p):n;
  181.    else if(ignoreCase&&(bLower(find.data[2])==bLower(bs.data[i+p+2])))return (i+p+2<bs.size)?i:n;
  182.    else if(find.data[2]==bs.data[i+p+2])return (i+p+2<bs.size)?i+p:n;
  183.   }
  184.  }else if(find.size<7){
  185.   unsigned s=*(bUnaligned32*)find.data;
  186.   if(ignoreCase)s=lower32(s);
  187.   for(unsigned i=from;i<bs.size;){
  188.    bUnaligned32 t=*(bUnaligned32*)((char*)bs.data+i);
  189.    if(ignoreCase)t=lower32(t);
  190.    if(s==t){
  191.     if(find.size==4)return i;
  192.     bString st0=bStringStatic(find.data+4,find.size-4),st1=bStringStatic((char*)bs.data+i+4,st0.size);
  193.     if(bCollateStringFast(&st0,&st1)==0)return i;
  194.     else i++;
  195.     continue;
  196.    }
  197.    if((t>>8)==(s&16777215))i+=1;
  198.    else if((t>>16)==(s&65535))i+=2;
  199.    else if((t>>24)==(s&255))i+=3;
  200.    else i+=4;
  201.   }
  202.  }else{
  203.   unsigned skip[256],i,j=find.size;
  204.   for(i=0;i<256;i++)skip[i]=(unsigned)-1;
  205.   if(ignoreCase){
  206.    for(i=0;i<find.size;i++)skip[bLower(find.data[i])]=i;
  207.    for(i=from;i<(bs.size-j+1);j=find.size){
  208.     while((j>0)&&(bLower(find.data[j-1])==bLower(bs.data[i+j-1])))j--;
  209.     if(j==0)return i;
  210.     else i+=bMax(1,(int32_t)((j-1)-skip[bLower(bs.data[i+(j-1)])]));
  211.    }
  212.   }else{
  213.    for(i=0;i<find.size;i++)skip[find.data[i]]=i;
  214.    for(i=from;i<(bs.size-j+1);j=find.size){
  215.     while((j>0)&&(find.data[j-1]==bs.data[i+j-1]))j--;
  216.     if(j==0)return i;
  217.     else i+=bMax(1,(int32_t)((j-1)-skip[bs.data[i+(j-1)]]));
  218.    }
  219.   }
  220.  }
  221.  return (unsigned)-1;
  222. }
  223. int bStringReplace(bString *bs,bString from,bString to){
  224.  bArrayUint r={0};
  225.  for(unsigned pos=0;pos<bs->size;)
  226.   if((pos=bStringFind(*bs,from,pos,0))<bs->size)bArrayUintAdd(&r,pos),pos+=from.size;
  227.  if(r.size==0)return bArrayUintFree(&r),0;
  228.  if(to.size>from.size){
  229.   unsigned oldsz=bs->size;
  230.   bStringSetCapacity(bs,(bs->size=bs->size+(r.size*(to.size-from.size))));
  231.   memset(bs->data+bs->size,0,ARRAY_EXTRA);
  232.   for(unsigned i=r.size-1,o=0,f=from.size,t=to.size;i<r.size;i--,o+=(t-f)){
  233.    memmove(bs->data+(r.data[i]+o+t),bs->data+(r.data[i]+o+f),oldsz-(r.data[i]+f));
  234.    memcpy(bs->data+(r.data[i]+o),to.data,t);
  235.   }
  236.  }else if(to.size<from.size){
  237.   if(bs->size-(r.size*(from.size-to.size))==0)bStringFree(bs);
  238.   else{
  239.    for(unsigned i=0,f=from.size,t=to.size,offs=0;i<r.size;i++,offs+=(f-t),bs->size-=(f-t)){
  240.     memcpy(bs->data+(r.data[i]-offs),to.data,t);
  241.     memmove(bs->data+(r.data[i]-offs+t),bs->data+(r.data[i]-offs+f),bs->size-(r.data[i]-offs+f));
  242.    }
  243.    memset(bs->data+bs->size,0,ARRAY_EXTRA);
  244.   }
  245.  }else if(to.size==from.size)for(unsigned i=0;i<r.size;i++)memcpy(bs->data+r.data[i],to.data,to.size);
  246.  bArrayUintFree(&r);
  247.  return 0;
  248. }
  249. int bStringReplaceC(bString *bs,char *from,char *to){
  250.  bString f=bStringFrom(from,0),t=bStringFrom(to,0);
  251.  int ret=bStringReplace(bs,f,t);
  252.  bStringFree(&t),bStringFree(&f);
  253.  return ret;
  254. }
  255. bColor bColorFromRGBA(uint8_t r,uint8_t g,uint8_t b,uint8_t a){return (bColor){.r=r,.g=g,.b=b,.a=a};}
  256. bColor bColorFromRGB(uint8_t r,uint8_t g,uint8_t b){return bColorFromRGBA(r,g,b,255);}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement