NAMD
Macros | Functions
flipdcd.c File Reference
#include "largefiles.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Go to the source code of this file.

Macros

#define MAP_FILE   0
 
#define FLIPFOUR   {for(j=0;j<4;++j)b[j]=d[j];for(j=3;j>=0;--j,++d)*d=b[j];n-=4;}
 
#define FLIPEIGHT   {for(j=0;j<8;++j)b[j]=d[j];for(j=7;j>=0;--j,++d)*d=b[j];n-=8;}
 
#define SKIPFOUR   {d+=4;n-=4;}
 
#define SKIP(X)   {d+=(X);n-=(X);}
 
#define READINT(X)
 

Functions

int main (int argc, char *argv[])
 

Macro Definition Documentation

#define FLIPEIGHT   {for(j=0;j<8;++j)b[j]=d[j];for(j=7;j>=0;--j,++d)*d=b[j];n-=8;}
#define FLIPFOUR   {for(j=0;j<4;++j)b[j]=d[j];for(j=3;j>=0;--j,++d)*d=b[j];n-=4;}

Referenced by main().

#define MAP_FILE   0

Definition at line 22 of file flipdcd.c.

Referenced by main().

#define READINT (   X)
Value:
{ X=0; if (isbig) { for(j=0;j<4;++j,X<<8) X+=d[j]; } \
else { for(j=3;j>=0;--j,X<<8) X+=d[j]; } }
#define X
Definition: msm_defn.h:29

Referenced by main().

#define SKIP (   X)    {d+=(X);n-=(X);}

Referenced by main().

#define SKIPFOUR   {d+=4;n-=4;}

Referenced by main().

Function Documentation

int main ( int  argc,
char *  argv[] 
)

Definition at line 25 of file flipdcd.c.

References FLIPFOUR, MAP_FILE, READINT, SKIP, and SKIPFOUR.

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