Advertisement
Guest User

dan

a guest
Mar 27th, 2017
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.16 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define n 65
  6. #define block 5
  7.  
  8. int indexToBlock(int cell);
  9. int blockToIndex(int blk);
  10. int powerExp(int exp);
  11. int power(int value, int powerValue);
  12. void deletefile(char* method, int *memArray);
  13. int findReqBlocksWithPtr(int rows);
  14. int *findFreeBlock(int reqBlocks, long decBitmap, char* method);
  15. long decimalToBinary(long dec);
  16. long binaryToDecimal(long bin);
  17. int *getDirectoryData(int data, char* method);
  18. int *newMemory();
  19. int getFileName(int a);
  20. void printDiskMap(char* method, int *memArray);
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27. int foundStart, foundEnd;
  28. int startIndex;
  29.  
  30.  
  31.  
  32.  
  33. /* main function to call above defined function */
  34. int main () {
  35.  
  36. int *memory;
  37. char * allocMethod;
  38.  
  39. allocMethod = "indexed";
  40. memory = newMemory();
  41. memory[1] = 10002;
  42. memory[blockToIndex(1)] = binaryToDecimal(11100111110);
  43. memory[10] = 8;
  44. memory[11] = 9;
  45. memory[40] = 101;
  46. memory[41] = 102;
  47. memory[42] = 103;
  48. memory[43] = 104;
  49. memory[44] = 105;
  50. memory[45] = 106;
  51.  
  52. // printDiskMap(allocMethod,memory);
  53.  
  54. free(memory);
  55. allocMethod = "contiguous";
  56. memory = newMemory();
  57. memory[40] = 40;
  58.  
  59. memory[0]=1000202;
  60. memory[1]= 2000505;
  61. memory[10] =101;
  62. memory[11] =102;
  63. memory[12] =103;
  64. memory[13] =104;
  65. memory[14] =105;
  66. memory[15] =106;
  67. memory[16] =107;
  68. memory[17] =108;
  69. memory[18] =109;
  70. memory[19] =110;
  71. memory[20] =111;
  72. memory[21] =112;
  73. memory[22] =113;
  74. memory[23] =114;
  75. memory[24] =115;
  76.  
  77. deletefile(allocMethod, memory);
  78. printDiskMap(allocMethod,memory);
  79.  
  80. free(memory);
  81. allocMethod = "linked";
  82. memory = newMemory();
  83.  
  84. memory[0]=1000204;
  85. memory[1]= 2000505;
  86. memory[10]= 101;
  87. memory[11]= 102;
  88. memory[12] = 103;
  89. memory[13] = 104;
  90. memory[14] = 4;
  91. memory[20] = 105;
  92. memory[21]= 106;
  93. memory[25] = 201;
  94. memory[26] = 202;
  95. memory[27] = 203;
  96.  
  97. //deletefile(allocMethod, memory);
  98. //printDiskMap(allocMethod,memory);
  99.  
  100.  
  101.  
  102.  
  103. /* testing getDirectoryData function
  104. int *dataArray;
  105. dataArray = getDirectoryData(678911, "linked");
  106. printf("Filename: %d | start: %d | end: %d\n",dataArray[0],dataArray[1],dataArray[2]);
  107. */
  108.  
  109.  
  110. /* testing findFreeBlock function
  111. long todec = 1111100000;
  112. printf("%ld\n",todec);
  113.  
  114.  
  115. int *testArray;
  116. long bitmap = binaryToDecimal(todec);
  117. testArray = findFreeBlock(3, bitmap, "contiguous");
  118. //printf("Contiguous free block: %d\n\n",testArray[0]);
  119.  
  120. testArray = findFreeBlock(6, bitmap, "linked");
  121. printf("linked free block: ");
  122. for (int i = 0; i < 6; i++){
  123. //printf("%d ",testArray[i]);
  124. }
  125.  
  126. testArray = findFreeBlock(5, bitmap, "indexed");
  127. printf("\nindexed free block: ");
  128. for (int i = 0; i < 6; i++){
  129. printf("%d ",testArray[i]);
  130. }
  131. */
  132.  
  133. return 0;
  134. }
  135.  
  136. int indexToBlock(int cell){
  137. return cell/5;
  138. }
  139.  
  140. int blockToIndex(int blk){
  141. return blk*5;
  142. }
  143.  
  144. int powerExp(int exp){
  145. int result = 1;
  146. int base = 10;
  147. for (exp;exp>0;exp--){
  148. result *= base;
  149. }
  150. return result;
  151.  
  152. }
  153.  
  154. int power(int value, int powerValue){
  155. int result = 1;
  156. for (int i = 0; i < powerValue; i++){
  157. result *= value;
  158. }
  159. return result;
  160. }
  161.  
  162. int getFileName(int a) {
  163.  
  164. int fileName;
  165. return fileName = (a/100)*100;
  166.  
  167. }
  168.  
  169.  
  170. int findReqBlocksWithPtr(int rows){
  171. int reqBlocks = 0;
  172. // if theres 5 or less rows, only 1 block is needed
  173. if (rows <= 5){
  174. reqBlocks = 1;
  175. }
  176.  
  177. // if theres more than 5 rows, each block can only store
  178. // the location of 4 blocks, and 1 pointer
  179. else {
  180. while (rows > 0) {
  181. // if 1 block is remaining, it does not need 1 more index block, it can fit in the last index block
  182. // there is only 4 blocks used in the last index block and we dont need a pointer for it
  183. if (rows != 1){
  184. rows -= 4;
  185. reqBlocks++;
  186. }
  187. else {
  188. break;
  189. }
  190. }
  191. }
  192. return reqBlocks;
  193. }
  194.  
  195. int *findFreeBlock(int reqBlocks, long decBitmap, char* method){
  196. // convert dec bitmap to bin bitmap
  197. long binBitmap = decimalToBinary(decBitmap);
  198. // how many bits the bitmap have
  199. int nDigits = 1;
  200. long countData = binBitmap;
  201. // divide by 10 until countData is left with a single digit
  202. while (countData > 9) {
  203. nDigits++;
  204. countData /= 10;
  205. }
  206. //printf("digits: %d\n", nDigits);
  207.  
  208. int freeBlocksCount = 0, counter = 0;
  209.  
  210. long remainder;
  211. // finding free blocks for contiguous
  212. if (strcmp(method, "contiguous") == 0){
  213. // create array of size 1 and set it to -1
  214. static int freeBlockFound[1] = {-1};
  215. while(binBitmap != 0) {
  216. remainder = binBitmap%10;
  217. if (remainder == 1){
  218. // free block found
  219. if (freeBlocksCount == 0){
  220. // new free block
  221. freeBlockFound[0] = counter+2;
  222. }
  223. freeBlocksCount +=1;
  224. if (freeBlocksCount == reqBlocks){
  225. return freeBlockFound;
  226. }
  227. }
  228. else {
  229. freeBlocksCount = 0;
  230. freeBlockFound[0] = -1;
  231. }
  232.  
  233. binBitmap /= 10;
  234. counter++;
  235. }
  236. // no space for conti allocation
  237. freeBlockFound[0] = -1;
  238. return freeBlockFound;
  239. }
  240.  
  241. // finding free blocks for linked
  242. else if (strcmp(method, "linked") == 0){
  243. // static int freeBlockFound[reqBlocks];
  244. // create array of size required blocks size and set it to -1
  245. int *freeBlockFound = malloc(reqBlocks * sizeof *freeBlockFound);
  246.  
  247. while(binBitmap != 0) {
  248. remainder = binBitmap%10;
  249. if (remainder == 1){
  250. // free block found
  251. freeBlocksCount++;
  252. freeBlockFound[freeBlocksCount-1] = counter + 2;
  253. if (freeBlocksCount == reqBlocks){
  254. return freeBlockFound;
  255. }
  256. }
  257.  
  258. binBitmap /= 10;
  259. counter++;
  260. }
  261. // no space for linked allocation
  262. freeBlockFound[0] = -1;
  263. return freeBlockFound;
  264. }
  265.  
  266. // finding free blocks for indexed
  267. else {
  268. // calculate number of index blocks required for index allocation
  269. int reqIndexBlocks = findReqBlocksWithPtr(reqBlocks);
  270.  
  271. // create array of and set it to -1. Every free data and index block found will be stored here
  272. int *freeBlockFound = malloc((reqBlocks + reqIndexBlocks) * sizeof *freeBlockFound);
  273. int enoughFreeIndex = 0;
  274. while(binBitmap != 0) {
  275. remainder = binBitmap%10;
  276. // 5 blocks for index, find free index blocks
  277. if (counter < 5){
  278. // dont need to check already once we know we have enough index blocks
  279. if (enoughFreeIndex == 0){
  280. printf("\nChecking indexed block");
  281. if (remainder == 1) {
  282. printf ("\nfree index block found at: %d",counter+2);
  283. // free index block found
  284. freeBlocksCount++;
  285. freeBlockFound[freeBlocksCount-1] = counter + 2;
  286. if (freeBlocksCount == reqIndexBlocks) {
  287. enoughFreeIndex = 1;
  288. printf("enough index");
  289. }
  290. }
  291. }
  292.  
  293. }
  294. // will run below code once done checking for free index blocks
  295. else if (enoughFreeIndex == 0) {
  296. // no space in index blocks
  297. freeBlockFound[0] = -1;
  298. printf("not enough index");
  299. return freeBlockFound;
  300. }
  301. else {
  302. if (remainder == 1) {
  303. printf ("\nfree data block found at: %d",counter+2);
  304. freeBlocksCount++;
  305. freeBlockFound[freeBlocksCount-1] = counter + 2;
  306. if (freeBlocksCount == reqBlocks + reqIndexBlocks){
  307. return freeBlockFound;
  308. }
  309. }
  310. }
  311. binBitmap /= 10;
  312. counter++;
  313. }
  314. // no space for indexed allocation
  315. freeBlockFound[0] = -1;
  316. return freeBlockFound;
  317.  
  318.  
  319. }
  320. }
  321.  
  322. /* Function to convert a decinal number to binary number */
  323. long decimalToBinary(long dec) {
  324. long remainder;
  325. long binary = 0, i = 1;
  326.  
  327. while(dec != 0) {
  328. remainder = dec % 2;
  329. dec /= 2;
  330. binary += (remainder*i);
  331. i = i*10;
  332. }
  333. return binary;
  334. }
  335.  
  336. /* Function to convert a binary number to decimal number */
  337. long binaryToDecimal(long bin) {
  338. long remainder;
  339. long decimal = 0, i = 0;
  340. while(bin != 0) {
  341. remainder = bin % 10;
  342. bin /= 10;
  343. decimal += (remainder*power(2,i));
  344. ++i;
  345. }
  346. return decimal;
  347. }
  348.  
  349.  
  350.  
  351.  
  352. void deletefile(char* method, int *memArray) {
  353.  
  354. //link
  355.  
  356. int userinput = 100;
  357.  
  358.  
  359. //compare with method name.
  360. for (int i = 0; i < 5; i++) {
  361.  
  362. if (userinput == getDirectoryData(memArray[i], method)[0]) {
  363.  
  364. foundStart = getDirectoryData(memArray[i], method)[1];// start block;
  365. foundEnd = getDirectoryData(memArray[i], method)[2];
  366. memArray[i] = -1;
  367. startIndex = blockToIndex(foundStart);
  368. //printf("%d", startIndex);
  369.  
  370. }
  371.  
  372. }
  373. if (strcmp(method, "linked") == 0) {
  374.  
  375. while (foundStart != foundEnd) {
  376.  
  377. foundStart = memArray[startIndex + 4];
  378.  
  379. for (int i = startIndex; i < startIndex + 5; i++) {
  380. memArray[i] = 2;
  381.  
  382. }
  383.  
  384. startIndex = blockToIndex(foundStart);
  385.  
  386. printf("%d", foundStart);
  387.  
  388. }
  389.  
  390. for (int i = startIndex; i < (foundEnd-foundStart) ; i++) {
  391. memArray[i] = 2;
  392.  
  393. }
  394.  
  395. } else if (strcmp(method, "contiguous") == 0) {
  396. for (int i = startIndex; i < (15 ); i++) {
  397. memArray[i] = 1;
  398.  
  399. }
  400. }
  401. }
  402.  
  403. int *getDirectoryData(int data, char* method){
  404.  
  405. // how many digits the data have
  406. int nDigits = 1, countData = data;
  407. while (countData > 9) {
  408. nDigits++;
  409. countData /= 10;
  410. }
  411. // printf("digits: %d\n", nDigits);
  412.  
  413. // extracting individual digits
  414. int digitsArray[nDigits];
  415. memset( digitsArray, 0,nDigits*sizeof(int) );
  416. int digitsArrayInd = nDigits - 1;
  417.  
  418. int remainder;
  419. while(data != 0)
  420. {
  421. remainder = data%10;
  422. digitsArray[digitsArrayInd--] = remainder;
  423. data /= 10;
  424. }
  425.  
  426. // converting individual digits into correct data
  427. static int dataArray[3] = {0};
  428. int dataArrayInd = nDigits -1;
  429.  
  430. if (strcmp(method, "indexed") == 0){
  431. // INDEXED
  432. // e.g. [1,2,3,4,5] = filename: 123, indexedLocation: 45
  433. dataArray[0] = 0;
  434. dataArray[1] = digitsArray[dataArrayInd--] + (digitsArray[dataArrayInd--]*10);
  435. for (int i = 0; i < nDigits-2; i++){
  436. if (i == 0){
  437. dataArray[0] += digitsArray[dataArrayInd--];
  438. }
  439. else {
  440. dataArray[0] += (digitsArray[dataArrayInd--] * powerExp(i));
  441. }
  442. }
  443. }
  444. else {
  445. // CONTIGUOUS/LINKED
  446. // e.g. [1,2,3,4,5,6,7] = filename: 123, start: 45, end: 67
  447. dataArray[0] = 0;
  448. dataArray[2] = digitsArray[dataArrayInd--] + (digitsArray[dataArrayInd--]*10);
  449. dataArray[1] = digitsArray[dataArrayInd--] + (digitsArray[dataArrayInd--]*10);
  450. for (int i = 0; i < nDigits-4; i++){
  451. if (i == 0){
  452. dataArray[0] += digitsArray[dataArrayInd--];
  453. }
  454. else {
  455. dataArray[0] += (digitsArray[dataArrayInd--] * powerExp(i));
  456. }
  457. }
  458. }
  459.  
  460.  
  461. return dataArray;
  462.  
  463. }
  464.  
  465. int *newMemory(){
  466.  
  467. int *mem = malloc(n * sizeof *mem);
  468.  
  469. // all allocation methods will have 1 block reserved for directory
  470. for (int i = 0; i < block; i++){
  471. // -1 meaning empty
  472. mem[i] = -1;
  473. }
  474.  
  475. // all allocation methods will have 1 block reserved for bitmap
  476. for (int i = block; i < 2*block; i++){
  477. // every entry is pointing to next entry (empty space)
  478. if (i == block){
  479. // only first cell of bitmap block will be used
  480. mem[i] = binaryToDecimal(11111111111);
  481. }
  482. else {
  483. // the rest set as -1
  484. mem[i] = -1;
  485. }
  486. }
  487.  
  488. // everything else will be empty data blocks
  489. for (int i = 2*block; i < n; i++){
  490. mem[i] = -1;
  491. }
  492.  
  493. return mem;
  494. }
  495.  
  496. void printDiskMap(char* method, int *memArray){
  497. printf("-Disk map for %s allocation method-\n", method);
  498.  
  499. int *dataArray;
  500.  
  501. //printing directory
  502. if (strcmp("indexed",method) == 0){
  503. for (int i = 0; i < block; i++){
  504. if (memArray[i] < 0){
  505. printf("%2d - B%-2d - %s \n",i,indexToBlock(i),"empty");
  506. }
  507. else {
  508. dataArray = getDirectoryData(memArray[i],method);
  509. printf("%2d - B%-2d - %d, %d \n",i,indexToBlock(i),dataArray[0],dataArray[1]);
  510. }
  511. }
  512. }
  513. else {
  514. for (int i = 0; i < block; i++){
  515. if (memArray[i] < 0){
  516. printf("%2d - B%-2d - %s \n",i,indexToBlock(i),"empty");
  517. }
  518. else {
  519. dataArray = getDirectoryData(memArray[i],method);
  520. printf("%2d - B%-2d - %d, %d, %d \n",i,indexToBlock(i),dataArray[0],dataArray[1],dataArray[2]);
  521. }
  522. }
  523. }
  524.  
  525.  
  526.  
  527. // printing bitmap block
  528. printf("%2d - B%-2d - %d\n",block,indexToBlock(block),memArray[block]);
  529. for (int i = block+1; i < 2*block; i++){
  530. printf("%2d - B%-2d - Unused\n",i,indexToBlock(i));
  531. }
  532.  
  533. // printing index and data
  534. for (int i = 2*block; i < n; i++){
  535. printf("%2d - B%-2d - %d\n",i,indexToBlock(i),memArray[i]);
  536. }
  537.  
  538. }
  539.  
  540. /*****************************************************************
  541. /* NOTES / TO-DO / QUESTIONS
  542. /*****************************************************************
  543.  
  544. [Directory data - Block 0]
  545. When empty: -1
  546. When not empty:
  547. Indexed: 543289
  548. (5432 - file name[1-4 digits], immediately followed by 89 - index location[MUST be 2 digits])
  549.  
  550. Linked & Contiguous: 54326789
  551. (5432 - file name[1-4 digits], immediately followed by 67 - start[Must be 2 digits], then 89 - end[Must be 2 digits])
  552.  
  553. [Bitmap - Block 1]
  554. 1 representing empty space, 0 representing used space
  555. Read backwards - LSB is block 2
  556.  
  557.  
  558. [Index]
  559. When empty: -1
  560. When not empty: pointer to data location
  561.  
  562. [File data]
  563. When empty: -1
  564. when not empty: a positive number
  565.  
  566.  
  567.  
  568.  
  569. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement