Doxygen Source Code Documentation
t_ncio.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include "ncio.h"
Go to the source code of this file.
Data Structures | |
struct | riu |
Defines | |
#define | ENOERR 0 |
Typedefs | |
typedef riu | riu |
Functions | |
void | usage (const char *av0) |
long | argscale (const char *arg, const char *tag) |
void | modify_ex (off_t offset, size_t extent, void *vp) |
void | free_riu (riu *riup) |
riu * | new_riu (off_t offset, size_t extent, void *vp) |
void | riu_push (off_t offset, size_t extent, void *vp) |
int | riu_pop (off_t offset, int modify) |
main (int ac, char *av[]) | |
Variables | |
riu * | stack = NULL |
Define Documentation
|
Definition at line 13 of file t_ncio.c. Referenced by main(). |
Typedef Documentation
|
|
Function Documentation
|
Definition at line 49 of file t_ncio.c. References arg. Referenced by main().
00050 { 00051 long value = 0; 00052 /* last character */ 00053 const char *cp = arg + strlen(arg) -1; 00054 value = atol(arg); 00055 if(isalpha(*cp)) 00056 { 00057 switch(*cp) { 00058 case 'k': 00059 case 'K': 00060 value *= 1024; 00061 break; 00062 case 'm': 00063 case 'M': 00064 value *= (1024*1024); 00065 break; 00066 default: 00067 value = 0; /* trigger error below */ 00068 break; 00069 } 00070 } 00071 if(value == 0) 00072 { 00073 fprintf(stderr, 00074 "Illegal %s \"%s\", ignored\n", tag, arg); 00075 } 00076 return value; 00077 } |
|
Definition at line 120 of file t_ncio.c. References free. Referenced by riu_pop().
00121 { 00122 if(riup == NULL) 00123 return; 00124 free(riup); 00125 } |
|
\** File : SUMA.c
Input paramters :
Definition at line 192 of file t_ncio.c. References argscale(), ENOERR, flags, ncio::get, getopt(), ncio_close(), ncio_create(), ncio_open(), offset, ncio::rel, RGN_MODIFIED, RGN_WRITE, riu_pop(), riu_push(), strerror(), and usage().
00193 { 00194 char *path = ""; 00195 ncio *nciop; 00196 char linebuf[128]; 00197 off_t offset; 00198 size_t extent; 00199 void *vp; 00200 int status = ENOERR; 00201 int verbose = 0; 00202 int flags = 0; 00203 int create = 0; 00204 off_t igeto = 0; 00205 size_t igetsz = 0; 00206 size_t initialsz = 0; 00207 int doUnlink = 0; 00208 size_t sizehint = NC_SIZEHINT_DEFAULT; 00209 00210 { 00211 extern int optind; 00212 extern int opterr; 00213 extern char *optarg; 00214 int ch; 00215 00216 opterr = 1; 00217 00218 while ((ch = getopt(ac, av, "vwcnLSUo:i:I:s:")) != EOF) 00219 switch (ch) { 00220 case 'v': 00221 verbose = 1; 00222 break; 00223 case 'w': 00224 flags |= NC_WRITE; 00225 break; 00226 case 'c': 00227 create = 1; 00228 break; 00229 case 'n': 00230 create = 1; 00231 flags |= NC_NOCLOBBER; 00232 break; 00233 case 'L': 00234 flags |= NC_LOCK; 00235 break; 00236 case 'S': 00237 flags |= NC_SHARE; 00238 break; 00239 case 'U': 00240 doUnlink = 1; 00241 break; 00242 case 'o': 00243 igeto = argscale(optarg, "igeto"); 00244 break; 00245 case 'i': 00246 igetsz = argscale(optarg, "igetsz"); 00247 break; 00248 case 'I': 00249 initialsz = argscale(optarg, "initialsz"); 00250 break; 00251 case 's': 00252 sizehint = argscale(optarg, "sizehint"); 00253 break; 00254 case '?': 00255 usage(av[0]); 00256 break; 00257 } 00258 00259 /* last arg, the file name, is required */ 00260 if(ac - optind <= 0) 00261 usage(av[0]) ; 00262 path = av[optind]; 00263 00264 00265 } 00266 00267 if(!create) 00268 { 00269 status = ncio_open(path, flags, 00270 igeto, igetsz, &sizehint, 00271 &nciop, &vp); 00272 if(status != ENOERR) 00273 { 00274 fprintf(stderr, "ncio_open: %s: %s\n", 00275 path, strerror(status)); 00276 return(EXIT_FAILURE); 00277 } 00278 } else { 00279 status = ncio_create(path, flags, initialsz, 00280 igeto, igetsz, &sizehint, 00281 &nciop, &vp); 00282 if(status != ENOERR) 00283 { 00284 fprintf(stderr, "ncio_create: %s: %s\n", 00285 path, strerror(status)); 00286 return(EXIT_FAILURE); 00287 } 00288 } 00289 00290 while(fgets(linebuf, sizeof(linebuf), stdin) != NULL) 00291 { 00292 offset = 0; 00293 extent = 0; 00294 00295 if(*linebuf == '#') 00296 continue; /* comment */ 00297 if(sscanf(linebuf, "rel 0x%lx", &offset) == 1 00298 || sscanf(linebuf, "rel %ld", &offset) == 1) 00299 { 00300 if(verbose) 00301 printf("- rel %8ld\n", offset); 00302 if(!riu_pop(offset, 0)) 00303 continue; 00304 status = nciop->rel(nciop, offset, 0); 00305 if(status) 00306 { 00307 fprintf(stderr, "- rel error: %s\n", 00308 strerror(status)); 00309 continue; 00310 } 00311 } 00312 else if(sscanf(linebuf, "relm 0x%lx", &offset) == 1 00313 || sscanf(linebuf, "relm %ld", &offset) == 1) 00314 { 00315 if(verbose) 00316 printf("- relm %8ld\n", offset); 00317 if(!riu_pop(offset, 1)) 00318 continue; 00319 status = nciop->rel(nciop, offset, RGN_MODIFIED); 00320 if(status) 00321 { 00322 fprintf(stderr, "- relm %8ld error: %s\n", 00323 offset, strerror(status)); 00324 continue; 00325 } 00326 } 00327 else if(sscanf(linebuf, "get 0x%lx %ld", &offset, &extent) == 2 00328 || sscanf(linebuf, "get %ld %ld", &offset, &extent) == 2) 00329 { 00330 if(verbose) 00331 printf("- get %10ld %8ld\n", offset, extent); 00332 status = nciop->get(nciop, offset, extent, 0, &vp); 00333 if(status) 00334 { 00335 fprintf(stderr, "- get error: %s\n", 00336 strerror(status)); 00337 continue; 00338 } 00339 riu_push(offset, extent, vp); 00340 } 00341 else if(sscanf(linebuf, "getw 0x%lx %ld", &offset, &extent) == 2 00342 || sscanf(linebuf, "getw %ld %ld", &offset, &extent) == 2) 00343 { 00344 if(verbose) 00345 printf("- getw %10ld %8ld\n", offset, extent); 00346 status = nciop->get(nciop, offset, extent, RGN_WRITE, &vp); 00347 if(status) 00348 { 00349 fprintf(stderr, "- getw error: %s\n", 00350 strerror(status)); 00351 continue; 00352 } 00353 riu_push(offset, extent, vp); 00354 } 00355 else if(strchr(linebuf, 'q') != NULL) 00356 break; 00357 else 00358 printf("???\n"); 00359 } 00360 00361 status = ncio_close(nciop, doUnlink); 00362 if(status != ENOERR) 00363 { 00364 fprintf(stderr, "ncio_close(%s): %s: %s\n", 00365 doUnlink ? "doUnlink" : "", 00366 path, strerror(status)); 00367 return(EXIT_FAILURE); 00368 } 00369 00370 return(EXIT_SUCCESS); 00371 } |
|
Definition at line 81 of file t_ncio.c. References offset. Referenced by riu_pop().
00082 { 00083 unsigned char *obuf = vp; 00084 const unsigned char *const end = &obuf[extent]; 00085 unsigned char *cp = obuf; 00086 00087 if(cp >= end) return; 00088 *cp++ = (unsigned char)( offset >> 24); 00089 if(cp >= end) return; 00090 *cp++ = (unsigned char)((offset & 0x00ff0000) >> 16); 00091 if(cp >= end) return; 00092 *cp++ = (unsigned char)((offset & 0x0000ff00) >> 8); 00093 if(cp >= end) return; 00094 *cp++ = (unsigned char)( offset & 0x000000ff); 00095 if(cp >= end) return; 00096 *cp++ = (unsigned char)( extent >> 24); 00097 if(cp >= end) return; 00098 *cp++ = (unsigned char)((extent & 0x00ff0000) >> 16); 00099 if(cp >= end) return; 00100 *cp++ = (unsigned char)((extent & 0x0000ff00) >> 8); 00101 if(cp >= end) return; 00102 *cp++ = (unsigned char)( extent & 0x000000ff); 00103 00104 while(cp < end) 00105 { 00106 *cp++ = (unsigned char) (cp - obuf); 00107 } 00108 } |
|
Definition at line 128 of file t_ncio.c. References riu::extent, malloc, riu::next, riu::offset, offset, riu::prev, and riu::vp. Referenced by riu_push().
00129 { 00130 riu *riup = (riu *)malloc(sizeof(riu)); 00131 if(riup == NULL) 00132 { 00133 fprintf(stderr, 00134 "new_riu: malloc failed\n"); 00135 exit(EXIT_FAILURE); 00136 } 00137 riup->next = NULL; 00138 riup->prev = NULL; 00139 riup->offset = offset; 00140 riup->extent = extent; 00141 riup->vp = vp; 00142 return riup; 00143 } |
|
Definition at line 159 of file t_ncio.c. References riu::extent, free_riu(), modify_ex(), riu::next, riu::offset, offset, riu::prev, and riu::vp. Referenced by main().
00160 { 00161 riu *riup = stack; 00162 while(riup != NULL) 00163 { 00164 if(riup->offset == offset) 00165 { 00166 if(modify) 00167 { 00168 modify_ex(riup->offset, riup->extent, riup->vp); 00169 } 00170 if(riup->next != NULL) 00171 { 00172 riup->next->prev = riup->prev; 00173 } 00174 if(riup == stack) 00175 { 00176 stack = riup->next; 00177 } 00178 else 00179 { 00180 assert(riup->prev != NULL); 00181 riup->prev->next = riup->next; 00182 } 00183 free_riu(riup); 00184 return 1; 00185 } 00186 riup = riup->next; 00187 } 00188 /* else, not found */ 00189 return 0; 00190 } |
|
Definition at line 148 of file t_ncio.c. References new_riu(), riu::next, offset, and riu::prev. Referenced by main().
|
|
Definition at line 18 of file t_ncio.c.
00019 { 00020 (void)fprintf(stderr, 00021 "Usage: %s [options] fname\t\nOptions:\n", av0); 00022 (void)fprintf(stderr, 00023 "\t-v Verbose\n") ; 00024 (void)fprintf(stderr, 00025 "\t-w Open Read/Write, default is read only\n") ; 00026 (void)fprintf(stderr, 00027 "\t-c Create, clobber existing\n") ; 00028 (void)fprintf(stderr, 00029 "\t-n Create, error if it already exists\n") ; 00030 (void)fprintf(stderr, 00031 "\t-L Use locking if available\n") ; 00032 (void)fprintf(stderr, 00033 "\t-S Share updates (turn off caching)\n") ; 00034 (void)fprintf(stderr, 00035 "\t-U Delete (unlink) on close\n") ; 00036 (void)fprintf(stderr, 00037 "\t-o igeto Initial get offset\n") ; 00038 (void)fprintf(stderr, 00039 "\t-i igetsz Initial get size\n") ; 00040 (void)fprintf(stderr, 00041 "\t-I initialsz Initial file size for create\n") ; 00042 (void)fprintf(stderr, 00043 "\t-s sizehint Buffer size\n") ; 00044 exit(EXIT_FAILURE); 00045 } |
Variable Documentation
|
|