Candidate_v1.7.0
        stable
      
      
      
| Line |  | 
|---|
| 1 | /*! | 
|---|
| 2 | ** \file get_address.c | 
|---|
| 3 | ** \ingroup (PSIO) | 
|---|
| 4 | */ | 
|---|
| 5 |  | 
|---|
| 6 | #include <util/psi3/libpsio/psio.h> | 
|---|
| 7 |  | 
|---|
| 8 | namespace psi3 { | 
|---|
| 9 | namespace libpsio { | 
|---|
| 10 |  | 
|---|
| 11 | /*! | 
|---|
| 12 | ** PSIO_GET_ADDRESS(): Given a starting page/offset and a shift length | 
|---|
| 13 | ** (in bytes), return the page/offset of the next position in the file. | 
|---|
| 14 | ** \ingroup(PSIO) | 
|---|
| 15 | */ | 
|---|
| 16 |  | 
|---|
| 17 | psio_address psio_get_address(psio_address start, ULI shift) | 
|---|
| 18 | { | 
|---|
| 19 | psio_address address; | 
|---|
| 20 | ULI bytes_left; | 
|---|
| 21 |  | 
|---|
| 22 | bytes_left = PSIO_PAGELEN - start.offset; /* Bytes remaining on fpage */ | 
|---|
| 23 |  | 
|---|
| 24 | if(shift >= bytes_left) { /* Shift to later page */ | 
|---|
| 25 | address.page = start.page + (shift - bytes_left)/PSIO_PAGELEN + 1; | 
|---|
| 26 | address.offset = shift - bytes_left - | 
|---|
| 27 | (address.page - start.page - 1)*PSIO_PAGELEN; | 
|---|
| 28 | } | 
|---|
| 29 | else {  /* Block starts on current page */ | 
|---|
| 30 | address.page = start.page; | 
|---|
| 31 | address.offset = start.offset + shift; | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 | return address; | 
|---|
| 35 | } | 
|---|
| 36 |  | 
|---|
| 37 | } | 
|---|
| 38 | } | 
|---|
       
      
  Note:
 See   
TracBrowser
 for help on using the repository browser.