Fix implicit declarations in C files
[namd.git] / src / flipdcd.c
1 /********************************************************************/
2 /*                                                                  */
3 /*   Copyright 1998, Jim Phillips and the University of Illinois.   */
4 /*                                                                  */
5 /********************************************************************/
6
7 /* Modified to include -s[tatus], -B[ig], -L[ittle] options,        */
8 /* and to process multiple files.                                   */
9 /* D. Barsky March 2002 LLNL                                        */
10
11 #include "largefiles.h"  /* must be first! */
12
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include <sys/mman.h>
16 #include <fcntl.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19
20 #ifndef MAP_FILE
21 #define MAP_FILE 0
22 #endif
23
24 int main(int argc, char *argv[]) {
25
26 int fd;
27 struct stat statbuf;
28 off_t n;
29 int i, j, isbig, itmp, argcount=0;
30 int status_only=0, make_big_only=0, make_little_only=0;
31 char b[8];
32 char *d;
33
34 if ( argc < 2 ) {
35   fprintf(stderr,"This program flips byte-ordering of DCD files.\n");
36   usage:
37   fprintf(stderr,"Usage: %s [-s] [-B] [-L] file . . . \n",argv[0]);
38   fprintf(stderr,"      The default behavior is to flip the byte ordering. Other options are:\n");
39   fprintf(stderr,"      -s report the byte-order status of each <file> without changing it\n");
40   fprintf(stderr,"      -B make/keep each <file> big-endian\n");
41   fprintf(stderr,"      -L make/keep each <file> little-endian\n");
42   fprintf(stderr,"      The options are mutually exclusive; the last one read is used.\n\n");
43   exit(-1);
44 }
45
46 while (++argcount < argc){
47    /* debug: printf("Current argument %d (out of %d): %s\n",argcount,argc-1,argv[argcount]); */ 
48    if ((strncmp(argv[argcount],"-S",2) == 0) || (strncmp(argv[argcount],"-s",2) == 0)){
49       status_only=1; make_big_only=0; make_little_only=0;
50    }
51    else if ((strncmp(argv[argcount],"-B",2) == 0) || (strncmp(argv[argcount],"-b",2) == 0)){
52       make_big_only=1; status_only=0; make_little_only=0;
53    }
54    else if ((strncmp(argv[argcount],"-L",2) == 0) || (strncmp(argv[argcount],"-l",2) == 0)){
55       make_little_only=1; make_big_only=0; status_only=0; 
56    }
57    else if (strncmp(argv[argcount],"-",1) == 0){
58       printf("\n Error: %s not a valid option. \n\n",argv[argcount]);
59       goto usage;
60    }
61    else{
62       if ( ( fd = open(argv[argcount], O_RDWR) ) < 0 ) {
63         fprintf(stderr,"Can't open %s for updating. (File must be read/writeable.)\n",argv[argcount]);
64         goto end;
65       }
66
67       if ( fstat(fd,&statbuf) < 0 ) {
68         fprintf(stderr,"Can't stat %s.\n",argv[1]);
69         goto end;
70       }
71       
72       n = statbuf.st_size;
73       
74       if ( n <= 104 ) {
75         fprintf(stderr,"%s is not in DCD format.\n",argv[argcount]);
76         goto end;
77       }
78
79       if ( ( sizeof(char*) < 8 ) && ( n >> 32 ) ) {
80         fprintf(stderr,"%s is too large, 64-bit build required\n",argv[argcount]);
81         goto end;
82       }
83       
84       if ( n % 4 ) {
85         fprintf(stderr,"%s is not in DCD format.\n",argv[argcount]);
86         goto end;
87       }
88       if ( ( d = mmap(0,n,PROT_READ|PROT_WRITE,MAP_FILE|MAP_SHARED,fd,0) )
89                                                               == (caddr_t) -1 ) {
90         fprintf(stderr,"Can't mmap %s.\n",argv[argcount]);
91         goto end;
92       }
93       
94       if ( status_only ){
95         if ( d[0] == 84 ) {
96           isbig = 0;
97           fprintf(stderr,"%s is little-endian.\n",argv[argcount]);
98         }
99         else if ( d[3] == 84 ) {
100           isbig = 1;
101           fprintf(stderr,"%s is big-endian.\n",argv[argcount]);
102         }
103         else {
104           fprintf(stderr,"%s is not in DCD format.\n",argv[argcount]);
105         }
106         goto end;  /* Done if only status is requested */
107         
108       }
109       else {
110         if ( d[0] == 84 ) {
111           if ( make_little_only ){
112             fprintf(stderr,"%s is already little-endian. (No change made.)\n",argv[argcount]);
113             goto end;
114           }
115           else {   
116             isbig = 0;
117             fprintf(stderr,"%s was little-endian, will be big-endian.\n",argv[argcount]);
118           }
119         }
120         else if ( d[3] == 84 ) {
121           if ( make_big_only ){
122             fprintf(stderr,"%s is already big-endian. (No change made.)\n",argv[argcount]);
123             goto end;
124           }
125           else {   
126             isbig = 1;
127             fprintf(stderr,"%s was big-endian, will be little-endian.\n",argv[argcount]);
128           }
129         }
130         else {
131           fprintf(stderr,"%s is not in DCD format.\n",argv[argcount]);
132           goto end;
133         }
134       }
135       
136 #define FLIPFOUR {for(j=0;j<4;++j)b[j]=d[j];for(j=3;j>=0;--j,++d)*d=b[j];n-=4;}
137 #define FLIPEIGHT {for(j=0;j<8;++j)b[j]=d[j];for(j=7;j>=0;--j,++d)*d=b[j];n-=8;}
138 #define SKIPFOUR {d+=4;n-=4;}
139 #define SKIP(X) {d+=(X);n-=(X);}
140 #define READINT(X) { X=0; if (isbig) { for(j=0;j<4;++j,X<<8) X+=d[j]; } \
141            else { for(j=3;j>=0;--j,X<<8) X+=d[j]; } }
142
143
144       FLIPFOUR;  /* 84 */
145       SKIPFOUR;  /* "CORD" */
146       for ( i = 0; i < 20; ++i ) FLIPFOUR;
147       FLIPFOUR;  /* 84 */
148       FLIPFOUR;  /* TITLE SIZE */
149       READINT(itmp); FLIPFOUR;  /* NTITLE */
150       if ( n <= (80*(off_t)itmp + 4) ) {
151         fprintf(stderr,"%s is too short for DCD format.\n",argv[argcount]);
152         goto end;
153       }
154       SKIP(80*itmp);
155       FLIPFOUR;  /* TITLE SIZE */
156       
157       while ( n ) FLIPFOUR;  /* WHATEVER UNTIL END */
158         ;
159       
160       }
161    end:
162       ;
163    }
164 }