From: Ioannis V. <no...@ho...> - 2002-06-12 07:02:19
Attachments:
merlin.h
|
/*=20 MERLIN Library made by Ioannis Vranos Copyright (C) 2001, 2002 Ioannis Vranos This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 = USA =20 You can contact the author of this library (Ioannis Vranos) at the = following email address: =20 no...@ho... =20 =20 The most current version of this library can be downloaded at http://www.noicys.cjb.net */ #ifndef MERLIN_IMPLEMENTATION_FILE #define MERLIN_IMPLEMENTATION_FILE #include <ctype.h> #include <limits.h> #include <stdarg.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <merlin.h> char *mitob(unsigned long n, unsigned short b) { const long LENGTH=3DCHAR_BIT*(sizeof(unsigned long)); char *matrix; static const char = characters[]=3D"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsigned long remain, *s; long i=3D0, j; if (b<2 || b>36) return NULL; s=3Dmalloc(LENGTH*sizeof(*s)); if (s=3D=3DNULL) return NULL; do { remain=3Dn%b; n/=3Db; if (i>LENGTH) { free(s); return NULL; } s[i++]=3Dremain; =20 }while(n!=3D0); matrix=3Dmalloc((i+1)*sizeof(*matrix)); if (matrix=3D=3D0) { free(s); return NULL; } for (--i, j=3D0; i>=3D0; --i, ++j) { if (s[i]>=3D36) /* The impossible */ { free(s); free(matrix); return NULL; } matrix[j] =3D characters[s[i]]; } matrix[j]=3D0; free(s); return matrix; } unsigned long *mfsize(const char *filename) { FILE *fp=3Dfopen(filename, "rb"); unsigned long *fsize=3Dcalloc(6, sizeof(*fsize)); /* Optimization stuff */ char temp[BUFSIZ]; static const long = DATALENGTH_MAX=3DLONG_MAX%2!=3D0?LONG_MAX-1:LONG_MAX; long datalength=3DDATALENGTH_MAX; unsigned long i, counter; if (fp=3D=3DNULL) { free(fsize); return NULL; } if (fsize=3D=3DNULL) { fclose(fp); return NULL; } /* fseek() doesn't signal EOF so i use fread() to detect the end of file = */ for (fseek(fp, datalength-1, SEEK_SET); datalength>0 && fread(temp, 1, = 1, fp)=3D=3D0; fseek(fp, datalength-1, SEEK_SET)) datalength/=3D128; fseek(fp, 0, SEEK_SET); =09 if (datalength=3D=3D0 && fread(temp, 1, 1, fp)=3D=3D0) { fclose(fp); return fsize; } else if (datalength=3D=3D0) datalength=3DBUFSIZ; fseek(fp, datalength-1, SEEK_SET); /* fseek() doesn't signal EOF so i use fread() to detect the end of = file */ for(counter=3D0; fread(temp, 1, 1, fp)!=3D0; ++counter) fseek(fp, datalength-1, SEEK_CUR); fseek(fp, 0, SEEK_SET); for( ; counter>0; --counter) { fseek(fp, datalength, SEEK_CUR); fsize[0]+=3Ddatalength; for (i=3D0; i<5 && fsize[i]/1024; ++i) { fsize[i+1]+=3Dfsize[i]/1024; fsize[i]%=3D1024; } } do { fsize[0]+=3Ddatalength=3Dfread(temp, 1, BUFSIZ, fp); for (i=3D0; i<5 && fsize[i]/1024; ++i) { fsize[i+1]+=3Dfsize[i]/1024; fsize[i]%=3D1024; } }while(datalength!=3D0); fclose(fp); return fsize; } unsigned long mscount(const char *s1, const char *s2) { char *pointer; unsigned long counter=3D0; if (strlen(s1)<strlen(s2) || strlen(s1)=3D=3D0 || strlen(s2)=3D=3D0) return 0; pointer=3Dstrstr(s1, s2); if (pointer=3D=3DNULL) return 0; else { while (pointer!=3DNULL) { ++counter; pointer=3Dstrstr(++pointer, s2); } } =20 return counter; } char *mstrcat(unsigned num, ...) { va_list arg_ptr; char *destination, *temp1, *temp2; size_t size, previous; unsigned counter; if (num=3D=3D0) return NULL; va_start(arg_ptr, num); for (size=3Dcounter=3D0; counter<num; ++counter) { previous=3Dsize; size+=3Dstrlen(va_arg(arg_ptr, char *)); if (size<previous) /* size has started to wrap around */ { va_end(arg_ptr); return NULL; } } va_end(arg_ptr); if(size+1<size) /* wraping protection */ { va_end(arg_ptr); return NULL; } temp1=3Ddestination=3Dmalloc((size+1)*sizeof(*destination)); if (destination=3D=3D0) return NULL; va_start(arg_ptr, num); for (counter=3D0; counter<num; ++counter) { temp2=3Dva_arg(arg_ptr, char *); while((*temp1++=3D*temp2++)!=3D0) ; --temp1; } va_end(arg_ptr); return destination; } char *mstrstr(char *s1, const char *s2) { size_t i, value; char *p; char *s1b, *s2b; if (strlen(s1)<strlen(s2)) return NULL; if (*s1=3D=3D'\0' || *s2=3D=3D'\0') return NULL; =20 s1b=3Dmalloc(strlen(s1)+1); s2b=3Dmalloc(strlen(s2)+1); =20 if(s1b=3D=3DNULL || s2b=3D=3DNULL) { free(s1b); free(s2b); return NULL; } strcpy(s1b, s1); strcpy(s2b, s2); for(i=3D0; (s1b[i]=3Dtolower(s1b[i]))!=3D0; i++) ; =20 =20 =20 for(i=3D0; (s2b[i]=3Dtolower(s2b[i]))!=3D0; ++i) ; p=3Dstrstr(s1b, s2b); =20 if(p=3D=3D0) { free(s1b); free(s2b); return NULL; } =20 else { value=3Dp-s1b; free(s1b); free(s2b); return &s1[value]; } } int mstrcmp(const char *cs, const char *ct) { char *s1, *s2; int compare; size_t i; s1=3Dmalloc(strlen(cs)+1); s2=3Dmalloc(strlen(ct)+1); strcpy(s1, cs); strcpy(s2, ct); for (i=3D0; i<strlen(s1); ++i) s1[i]=3Dtolower(s1[i]); for (i=3D0; i<strlen(s2); ++i) s2[i]=3Dtolower(s2[i]); compare=3Dstrcmp(s1, s2); free(s1); free(s2); return compare; } void *mrealloc(void *p, size_t current_size, size_t new_size) { void *newp=3Dmalloc(new_size); if(newp=3D=3DNULL) return NULL; if(new_size<=3Dcurrent_size) memcpy(newp, p, new_size); else memcpy(newp, p, current_size); free(p); return newp; } int mrand(const int lowest_value, const int largest_value) { const int AMOUNT=3Dlargest_value-lowest_value; int number; static short autoseeded=3D0; if(autoseeded=3D=3D0) { srand(time(NULL)); autoseeded++; } if(AMOUNT<=3D0 || AMOUNT>RAND_MAX) return INT_MIN; if(AMOUNT<RAND_MAX) { do number=3Drand() / (RAND_MAX / (AMOUNT+1)); while(number=3D=3DAMOUNT+1); } =09 else number=3Drand(); return (number+lowest_value); } #endif |
From: Luke D. <cod...@ho...> - 2002-06-12 07:29:57
|
Message Your code does not print leading zeroes for each byte, so the last two zeroes are because of the extra 2 bytes of padding that GCC stores (these bytes are not actually used so they don't affect calculations). Remember that sizeof(long double) was 12 for GCC and 10 for BCC. BTW, if possible you should probably send mails to this list in plain text instead of HTML because I have noticed a few people complain about it in the past. Luke Dunstan ----- Original Message ----- From: Ioannis Vranos To: MinGW Users Mailing List Sent: Wednesday, June 12, 2002 3:02 PM Subject: [Mingw-users] A debugging attempt I do not know so much about binary appearance of floating point numbers but i do see some difference in the representation between double and long double of 1: #include <stdio.h> #include <merlin.c> int main(void) { long double x=1; double y=1; unsigned long i; unsigned char *p=(unsigned char *)&x; puts("long double x="); for(i=0; i<sizeof(x); i++) printf("%s", mitob(p[i],2)); puts("\n\ndouble y="); for(p=(unsigned char *)&y, i=0; i<sizeof(y); i++) printf("%s", mitob(p[i],2)); return 0; } Use the attached files. It produces: C:\c>temp long double x= 0000000100000001111111111111100 double y= 00000011110000111111 when compiled with: > Executing: C:\Program Files\ConTEXT\ConExec.exe "gcc" "temp.c" -o temp -ansi -pedantic-errors -Wall -fexpensive-optimizations -O3 -ffloat-stor e -mcpu=pentiumpro With BCC32: C:\c>temp long double x= 00000001000000011111111111111 double y= 00000011110000111111 Intel: C:\c>temp long double x= 00000011110000111111 double y= 00000011110000111111 The only thing i notice is 2 zeros in the case of GCC on the right. I do not know if it has some importance. Ioannis * Ioannis Vranos * Programming pages: http://www.noicys.cjb.net * Alternative URL: http://run.to/noicys |
From: Earnie B. <ear...@ya...> - 2002-06-12 11:34:16
|
His mail isn't HTML Content-Type: multipart/mixed; boundary="----=_NextPart_000_0003_01C211F8.35D442E0" However, it would be appreciated if Ioannis would change to Content-Type: text/plain; charset="iso-8859-1" Earnie Luke Dunstan wrote: > > Message > Your code does not print leading zeroes for each byte, so the last two > zeroes are because of the extra 2 bytes of padding that GCC stores (these > bytes are not actually used so they don't affect calculations). Remember > that sizeof(long double) was 12 for GCC and 10 for BCC. > > BTW, if possible you should probably send mails to this list in plain text > instead of HTML because I have noticed a few people complain about it in the > past. > > Luke Dunstan > > ----- Original Message ----- > From: Ioannis Vranos > To: MinGW Users Mailing List > Sent: Wednesday, June 12, 2002 3:02 PM > Subject: [Mingw-users] A debugging attempt > > I do not know so much about binary appearance of floating point numbers but > i do see some difference in the representation between double and long > double of 1: > > #include <stdio.h> > #include <merlin.c> > > int main(void) > { > long double x=1; > double y=1; > unsigned long i; > unsigned char *p=(unsigned char *)&x; > > puts("long double x="); > for(i=0; i<sizeof(x); i++) > printf("%s", mitob(p[i],2)); > > puts("\n\ndouble y="); > > for(p=(unsigned char *)&y, i=0; i<sizeof(y); i++) > printf("%s", mitob(p[i],2)); > > return 0; > } > > Use the attached files. > > It produces: > > C:\c>temp > long double x= > 0000000100000001111111111111100 > > double y= > 00000011110000111111 > > when compiled with: > > > Executing: C:\Program Files\ConTEXT\ConExec.exe "gcc" "temp.c" -o > temp -ansi -pedantic-errors -Wall -fexpensive-optimizations -O3 -ffloat-stor > e -mcpu=pentiumpro > > With BCC32: > > C:\c>temp > long double x= > 00000001000000011111111111111 > > double y= > 00000011110000111111 > > Intel: > > C:\c>temp > long double x= > 00000011110000111111 > > double y= > 00000011110000111111 > > The only thing i notice is 2 zeros in the case of GCC on the right. I do not > know if it has some importance. > > Ioannis > > * Ioannis Vranos > * Programming pages: http://www.noicys.cjb.net > * Alternative URL: http://run.to/noicys > > _______________________________________________________________ > > Sponsored by: > ThinkGeek at http://www.ThinkGeek.com/ > _______________________________________________ > MinGW-users mailing list > Min...@li... > > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users |