diff --git a/WEGA/contrib/crc.c b/WEGA/contrib/crc.c index 1f5613f..0ba53c7 100644 --- a/WEGA/contrib/crc.c +++ b/WEGA/contrib/crc.c @@ -22,21 +22,29 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: crc.c,v 1.2 2007/04/16 04:12:11 olivleh1 Exp $ + * $Id: crc.c,v 1.3 2007/04/16 17:20:32 olivleh1 Exp $ */ #include -static void usage(char *); +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif -int main(int argc, char **argv) { +static void usage(); + +main(argc, argv) +char **argv; +{ char d,e,a1,a2; - int i,begin=0,end=-1,c; - FILE *f; + int i,c = 0; + int begin = 0; + int end = -1; + int f; char *filename; if(argc < 2 || argc > 4 ) - usage(argv[0]); + usage(argv[1]); filename = argv[1]; @@ -48,67 +56,62 @@ int main(int argc, char **argv) { if( end != -1 && begin > end ) { fprintf(stderr, "begin adress cannot be higher than end adress\n"); - usage(argv[0]); + usage(argv[1]); } - if( ! ( f = fopen(filename, "rb") ) ) { + f = open(filename, 0); + if (f<0) { fprintf(stderr, "cannot open %s \n", filename); - usage(argv[0]); + usage(argv[1]); } - fseek(f,begin,SEEK_SET); - d=0xff; e=0xff; - c=begin; + while( read(f, &a1, sizeof(a1)) ) { + if( c == end ) + break; - while(!feof(f)) { - if( end != -1 && c == end ) - break; - else - c++; - a1 = fgetc(f); - if( ferror(f) ) { - printf("File error\n"); - break; + if( c >= begin ) { + + a1=a1 ^ d; + d=a1; + for (i=0;i<4;i++) + {if ((a1 & 1)> 0) {a1=a1 >> 1; a1=a1 | 0x80;} + else {a1=a1 >> 1; a1=a1 & 0x7f;}} + a1=a1 & 0x0f; + a1=a1 ^ d; + d=a1; + for (i=0;i<3;i++) + {if ((a1 & 1)>0) {a1=a1 >> 1; a1=a1 | 0x80;} + else {a1=a1 >> 1; a1=a1 & 0x7f;}} + a2=a1; + a1=a1 & 0x1f; + a1=a1 ^ e; + e=a1; + a1=a2; + if ((a1 & 1)>0) {a1=a1 >> 1; a1=a1 | 0x80;} + else {a1=a1 >> 1; a1=a1 & 0x7f;} + a1=a1 & 0xf0; + a1=a1 ^ e; + e=a1; + a1=a2; + a1=a1 & 0xe0; + a1=a1 ^ d; + d=e; + e=a1; + a1=0xff; } - if( feof(f) ) { - break; - } - a1=a1 ^ d; - d=a1; - for (i=0;i<4;i++) - {if ((a1 & 1)> 0) {a1=a1 >> 1; a1=a1 | 0x80;} - else {a1=a1 >> 1; a1=a1 & 0x7f;}} - a1=a1 & 0x0f; - a1=a1 ^ d; - d=a1; - for (i=0;i<3;i++) - {if ((a1 & 1)>0) {a1=a1 >> 1; a1=a1 | 0x80;} - else {a1=a1 >> 1; a1=a1 & 0x7f;}} - a2=a1; - a1=a1 & 0x1f; - a1=a1 ^ e; - e=a1; - a1=a2; - if ((a1 & 1)>0) {a1=a1 >> 1; a1=a1 | 0x80;} - else {a1=a1 >> 1; a1=a1 & 0x7f;} - a1=a1 & 0xf0; - a1=a1 ^ e; - e=a1; - a1=a2; - a1=a1 & 0xe0; - a1=a1 ^ d; - d=e; - e=a1; + c++; } - fclose(f); + close(f); printf ("%s %02x%02x\n","crc_checksum:",d & 0xff,e & 0xff); return 0; } -static void usage(char *progname) { +static void usage(progname) +char *progname; +{ printf("usage: %s file [start adress] [end adress]\n", progname); exit(1); }