stable
        v1.7.0
      
      
      
| Rev | Line |  | 
|---|
| [0b990d] | 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.