* adfGetFileBlocks * */
| 94 | * |
| 95 | */ |
| 96 | RETCODE adfGetFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry, |
| 97 | struct FileBlocks* fileBlocks) |
| 98 | { |
| 99 | int32_t n, m; |
| 100 | SECTNUM nSect; |
| 101 | struct bFileExtBlock extBlock; |
| 102 | int32_t i; |
| 103 | |
| 104 | fileBlocks->header = entry->headerKey; |
| 105 | adfFileRealSize( entry->byteSize, vol->datablockSize, |
| 106 | &(fileBlocks->nbData), &(fileBlocks->nbExtens) ); |
| 107 | |
| 108 | fileBlocks->data=(SECTNUM*)malloc(fileBlocks->nbData * sizeof(SECTNUM)); |
| 109 | if (!fileBlocks->data) { |
| 110 | (*adfEnv.eFct)("adfGetFileBlocks : malloc"); |
| 111 | return RC_MALLOC; |
| 112 | } |
| 113 | |
| 114 | fileBlocks->extens=(SECTNUM*)malloc(fileBlocks->nbExtens * sizeof(SECTNUM)); |
| 115 | if (!fileBlocks->extens) { |
| 116 | (*adfEnv.eFct)("adfGetFileBlocks : malloc"); |
| 117 | return RC_MALLOC; |
| 118 | } |
| 119 | |
| 120 | n = m = 0; |
| 121 | /* in file header block */ |
| 122 | for(i=0; i<entry->highSeq; i++) |
| 123 | fileBlocks->data[n++] = entry->dataBlocks[MAX_DATABLK-1-i]; |
| 124 | |
| 125 | /* in file extension blocks */ |
| 126 | nSect = entry->extension; |
| 127 | while(nSect!=0) { |
| 128 | fileBlocks->extens[m++] = nSect; |
| 129 | adfReadFileExtBlock(vol, nSect, &extBlock); |
| 130 | for(i=0; i<extBlock.highSeq; i++) |
| 131 | fileBlocks->data[n++] = extBlock.dataBlocks[MAX_DATABLK-1-i]; |
| 132 | nSect = extBlock.extension; |
| 133 | } |
| 134 | if ( (fileBlocks->nbExtens+fileBlocks->nbData) != (n+m) ) |
| 135 | (*adfEnv.wFct)("adfGetFileBlocks : less blocks than expected"); |
| 136 | |
| 137 | return RC_OK; |
| 138 | } |
| 139 | |
| 140 | /* |
| 141 | * adfFreeFileBlocks |
no test coverage detected