From dc5620324b4ea3f710ef5c784f1ef3826cd95739 Mon Sep 17 00:00:00 2001 From: Hizenberg Date: Wed, 28 Feb 2024 20:13:45 +0530 Subject: [PATCH] Assignment5 Checked --- Assignment5/.bitarr.c.un~ | Bin 1082 -> 0 bytes Assignment5/.bitarr.h.un~ | Bin 1373 -> 0 bytes Assignment5/.bitmap.c.un~ | Bin 30555 -> 0 bytes Assignment5/.bitmap.h.un~ | Bin 8675 -> 0 bytes Assignment5/Makefile | 11 ++ Assignment5/README.md | 2 - Assignment5/bitarr.c~ | 188 ------------------------------- Assignment5/bitarr.h~ | 57 ---------- Assignment5/bitmap.c | 10 +- Assignment5/bitmap.c~ | 56 ---------- Assignment5/bitmap.h | 10 +- Assignment5/bitmap.h~ | 41 ------- Assignment5/bitsop.c | 1 + Assignment5/solution.c | 226 -------------------------------------- 14 files changed, 24 insertions(+), 578 deletions(-) delete mode 100644 Assignment5/.bitarr.c.un~ delete mode 100644 Assignment5/.bitarr.h.un~ delete mode 100644 Assignment5/.bitmap.c.un~ delete mode 100644 Assignment5/.bitmap.h.un~ create mode 100644 Assignment5/Makefile delete mode 100644 Assignment5/README.md delete mode 100644 Assignment5/bitarr.c~ delete mode 100644 Assignment5/bitarr.h~ delete mode 100644 Assignment5/bitmap.c~ delete mode 100644 Assignment5/bitmap.h~ delete mode 100644 Assignment5/solution.c diff --git a/Assignment5/.bitarr.c.un~ b/Assignment5/.bitarr.c.un~ deleted file mode 100644 index ab88154f8f70603a9c24adc2e63692a6d474f919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 zcmWH`%$*;a=aT=Ff$7oK*;Bku^tH^M8=IWbpY!-?uN#GLq~%o0saO>3YjwLr`b#Ed}91jHZ!qG6aJ^_J>17LY6>L;MAhED*pHg4iIb z3?OC!asC4VSOmlw1vCf&V03hYql1Crs|3*ebRfp!Hf?;q3IH?1TO$Af diff --git a/Assignment5/.bitarr.h.un~ b/Assignment5/.bitarr.h.un~ deleted file mode 100644 index 257416f32c4f521be569b7823f89054ed6fe504f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1373 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 diff --git a/Assignment5/.bitmap.h.un~ b/Assignment5/.bitmap.h.un~ deleted file mode 100644 index 56bf6cec58b01064c64dfe7e11235a50824d97c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8675 zcmeI1%TH556o*R%74d=M!Whs21bcxBC1VEi?C?Z_er5xwkX(Z*FBr z7QThTudaMuoB#CD_fo&tf4oTFsq;?P)l?^*MelC>se8HhJroM{i)o#ZMupg^z`;>l z$j^6wsN`%ol=>WeAsiezaO#{`Hy<`c1rHybEJVQ1U;0wO5eoe}BmFmsofnIUfug5* z#!qLmz8alK-WZ-prV^tQ*N4YbiR87>vB*>=H$Sw8)t%fBBG z(}FT&dvG|iM8T$nY`#FYqC{57fcroel9k4_Lzzi)7M~+a6l}`RcQ%?iOHwH@PmH9i zSEA|J$tBfBW)7-Snns6$U~G%gaH&0-_? z973XCQ+~edfr+q525S+EicuhwWMO(?DU!+N)YOxlpPHImn0_ef*rf(cM_gr#rAMM+1+@=f>55V|MH_oe&Qpc*iB4vA?ot=v@7(Xf7$sq|>;RBDw`_m#B@Si|

rTpsh{~ZT9hsTOQZxFcHqaU>mJex0qf#GM zHB~59i)lfaDWq_?9|NLbQ$qE*NtJ|Z6YCO#YEuy^e>3Tbim)*AS|hP|Tu6E*NWdKt z(*i2JHR5m}iGocD$e$)i(vv*mp%svQ0m$8@XYl3wLFt8MjhGgkVS5>eV@nilO17S= z%CQ~Wk!{3W#|>_-+q|nR>2yur0v*UljoV@Z06mV+K_?0}CD0qnK_A~M^k}Rsb}%0^ zZj33wgL)r6hn*NOtyOe zt5-$^L3l+!*8+yO5n4cFi^V0Oj)>KxfSNTyvGvTVScB4wDJj9LK^flpppy`mwZ`Sc zxkD_5&lOmrU{k_&&ScvzgRx(s*~Ydhu*tEJ@~@5Hc+$9X7&CF)%LOAS_L{==waJye z2}-8sYUHfs>gG#7wlxQ~Oh($ diff --git a/Assignment5/Makefile b/Assignment5/Makefile new file mode 100644 index 0000000..9c36f6c --- /dev/null +++ b/Assignment5/Makefile @@ -0,0 +1,11 @@ +TARGET: bitarr.o bitsop.o bitmap.o +bitarr.o: bitarr.c + gcc -c bitarr.c -o bitarr.o +bitsop.o: bitsop.c + gcc -c bitsop.c -o bitsop.o +bitmap.o: bitmap.c + gcc -c bitmap.c -o bitmap.o +clean: + rm bitarr.o + rm bitsop.o + rm bitmap.o diff --git a/Assignment5/README.md b/Assignment5/README.md deleted file mode 100644 index 19001ac..0000000 --- a/Assignment5/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# bitops_in_c -bitops_in_c diff --git a/Assignment5/bitarr.c~ b/Assignment5/bitarr.c~ deleted file mode 100644 index e35591c..0000000 --- a/Assignment5/bitarr.c~ +++ /dev/null @@ -1,188 +0,0 @@ -/* - * ===================================================================================== - * - * Filename: bitarr.c - * - * Description: - * - * Version: 1.0 - * Created: Sunday 04 March 2018 06:23:30 IST - * Revision: 1.0 - * Compiler: gcc - * - * Author: Er. Abhishek Sagar, Networking Developer (AS), sachinites@gmail.com - * Company: Brocade Communications(Jul 2012- Mar 2016), Current : Juniper Networks(Apr 2017 - Present) - * - * This file is part of the SPFComputation distribution (https://github.com/sachinites). - * Copyright (c) 2017 Abhishek Sagar. - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * ===================================================================================== - */ - -#include -#include -#include -#include "bitsop.h" -#include "bitarr.h" - -#define CHAR_SIZE 8 - -void -init_bit_array(bit_array_t *bitarr, unsigned int n_bits){ - - unsigned int n_byte_blocks = n_bits/CHAR_SIZE; - - if(n_bits % CHAR_SIZE) - n_byte_blocks++; - if(!bitarr->array) - bitarr->array = calloc(1, n_byte_blocks); - else - memset(bitarr->array, 0, n_byte_blocks); - bitarr->size = n_bits; - bitarr->trail_bits = n_bits % CHAR_SIZE; -} - -void -set_bit(bit_array_t *bitarr, unsigned int index){ - - if(index >= bitarr->size){ - printf("%u is out of array bounds [%u,%u]\n", - index, 0, bitarr->size -1); - return; - } - - unsigned byte_block = 0, - residual_bit = 0; - - byte_block = index / CHAR_SIZE; - residual_bit = index % CHAR_SIZE; - -#if 0 - assert(bitarr->size/CHAR_SIZE == byte_block && - bitarr->trail_bits >= residual_bit); -#endif - - char *ptr = bitarr->array + byte_block; - SET_BIT((*ptr), (CHAR_SIZE - residual_bit)); -} - -void -unset_bit(bit_array_t *bitarr, unsigned int index){ - - if(index >= bitarr->size){ - printf("%u is out of array bounds [%u,%u]\n", - index, 0, bitarr->size -1); - return; - } - - unsigned byte_block = 0, - residual_bit = 0; - - byte_block = index / CHAR_SIZE; - residual_bit = index % CHAR_SIZE; - -#if 0 - assert(bitarr->size/CHAR_SIZE == byte_block && - bitarr->trail_bits >= residual_bit); -#endif - - char *ptr = bitarr->array + byte_block; - UNSET_BIT((*ptr), (CHAR_SIZE - residual_bit)); -} - -char -is_bit_set(bit_array_t *bitarr, unsigned int index){ - - - if(index >= bitarr->size){ - printf("%u is out of array bounds [%u,%u]\n", - index, 0, bitarr->size -1); - return 0; - } - - unsigned byte_block = 0, - residual_bit = 0; - - byte_block = index / CHAR_SIZE; - residual_bit = index % CHAR_SIZE; - -#if 0 - assert(bitarr->size/CHAR_SIZE == byte_block && - bitarr->trail_bits >= residual_bit); -#endif - char *ptr = bitarr->array + byte_block; - return (char)(IS_BIT_SET((*ptr), (CHAR_SIZE - residual_bit))); -} - -unsigned int -get_next_available_bit(bit_array_t *bitarr){ - - unsigned int i = 0; - for(; i < bitarr->size; i++){ - if(is_bit_set(bitarr, i)) - continue; - return i; - } - return 0xFFFFFFFF; -} - -void -print_bit_array(bit_array_t *bitarr){ - - unsigned int i = 0, index = 0, - byte_blocks = 0, - residual_bits = 0; - - int j = 0; - - byte_blocks = bitarr->size / CHAR_SIZE; - residual_bits = bitarr->size % CHAR_SIZE; - //assert(bitarr->trail_bits >= residual_bit); - char *ptr = bitarr->array; - char byte = 0; - - for( ; i < byte_blocks; i++){ - byte = *(ptr+i); - for(j = 7; j >= 0; j--, index++){ - printf("[%u] : %c\n", index, IS_BIT_SET(byte, j) ? '1' : '0'); - } - } - - if(!residual_bits) - return; - - byte = *(ptr+i); - for(j = 7; j >= CHAR_SIZE - residual_bits; j--, index++){ - printf("[%u] : %c\n", index, IS_BIT_SET(byte, j) ? '1' : '0'); - } -} - - -#if 0 -int -main(int argc, char **argv){ - - bit_array_t *arr = calloc(1, sizeof(bit_array_t)); - init_bit_array(arr, 15); - set_bit(arr, 11); - set_bit(arr, 21); - set_bit(arr, 30); - set_bit(arr, 3); - set_bit(arr, 33); - print_bit_array(arr); - unset_bit(arr, 11); - print_bit_array(arr); - return 0; -} -#endif diff --git a/Assignment5/bitarr.h~ b/Assignment5/bitarr.h~ deleted file mode 100644 index 1fed46d..0000000 --- a/Assignment5/bitarr.h~ +++ /dev/null @@ -1,57 +0,0 @@ -/* - * ===================================================================================== - * - * Filename: bitarr.h - * - * Description: Interface to Bit Array - * - * Version: 1.0 - * Created: Sunday 04 March 2018 06:20:07 IST - * Revision: 1.0 - * Compiler: gcc - * - * Author: Er. Abhishek Sagar, Networking Developer (AS), sachinites@gmail.com - * Company: Brocade Communications(Jul 2012- Mar 2016), Current : Juniper Networks(Apr 2017 - Present) - * - * This file is part of the BIT Array distribution (https://github.com/sachinites). - * Copyright (c) 2017 Abhishek Sagar. - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * ===================================================================================== - */ - -#ifndef __BIT_ARRAY__ -#define __BIT_ARRAY__ - -typedef struct _bit_array{ - unsigned int size; - char *array; - char trail_bits; -} bit_array_t; - -void -init_bit_array(bit_array_t *bitarr, unsigned int size); - -void -set_bit(bit_array_t *bitarr, unsigned int index); - -void -unset_bit(bit_array_t *bitarr, unsigned int index); - -char -is_bit_set(bit_array_t *bitarr, unsigned int index); - -unsigned int -get_next_available_bit(bit_array_t *bitarr); - -#endif /* __BIT_ARRAY__ */ diff --git a/Assignment5/bitmap.c b/Assignment5/bitmap.c index 969db4c..bda192d 100644 --- a/Assignment5/bitmap.c +++ b/Assignment5/bitmap.c @@ -32,7 +32,7 @@ bitmap_is_full(bit_array_t *bitmap){ char *ptr = NULL; for(int block_num = 0 ; block_num < byte_block ; block_num ){ - ptr = bitarr->array+block_num; + ptr = bitmap->array+block_num; if( block_num == byte_block - 1 ){ if( (*ptr) != ~((1<<(CHAR_SIZE - residual_block))-1) ){ @@ -77,11 +77,11 @@ bitmap_pattern_match( bit_array_t *bitmap, char *binary_string,int n_bits,int *i for(int idx = 0 ; idx < n_bits ; idx++ ){ if( binary_string[idx] == '0' ){ - mask |= (1<<(n-1-idx)); + mask |= (1<<(n_bits-1-idx)); } else if( binary_string[idx] == '1' ){ - mask |= (1<<(n-1-idx)); - template |= (1<<(n-1-idx)); + mask |= (1<<(n_bits-1-idx)); + template |= (1<<(n_bits-1-idx)); } } @@ -89,7 +89,7 @@ bitmap_pattern_match( bit_array_t *bitmap, char *binary_string,int n_bits,int *i for( int idx = 0 ; idx + n_bits < sz ; idx++ ) { if( mask&bitmap_num == template ){ - i = idx; + *i = idx; return true; } mask <<= 1; diff --git a/Assignment5/bitmap.c~ b/Assignment5/bitmap.c~ deleted file mode 100644 index 9490da6..0000000 --- a/Assignment5/bitmap.c~ +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ===================================================================================== - * - * Filename: bitmap.c - * - * Description: - * - * Version: 1.0 - * Created: 23/02/24 08:02:40 PM IST - * Revision: none - * Compiler: gcc - * - * Author: YOUR NAME (), - * Organization: - * - * ===================================================================================== - */ - -#include "bitmap.h" - -#ifndef CHAR_SIZE -#define CHAR_SIZE 8 -#endif - -bool -bitmap_is_full(bit_array_t *bitmap){ - - unsigned int sz = bitmap->size; - unsigned int byte_block = sz/CHAR_SIZE; - unsigned int residual_block = sz%CHAR_SIZE; - - char *ptr = NULL; - for(int block_num = 0 ; block_num < byte_block ; block_num ){ - - ptr = bitarr->array+block_num; - - if( block_num == byte_block - 1 ){ - if( (*ptr) != ~((1<<(CHAR_SIZE - residual_block))-1) ){ - return false; - } - continue; - } - - if( (*ptr) != (1<<8)-1 ){ - return false; - } - } - - return true; - -} - -bool -bitmap_pattern_match( bit_array_t *bitmap, char *binary_string,int n_bits,int *i){ - -} diff --git a/Assignment5/bitmap.h b/Assignment5/bitmap.h index 3b09e46..0995663 100644 --- a/Assignment5/bitmap.h +++ b/Assignment5/bitmap.h @@ -20,13 +20,17 @@ #define __BITMAP_H_ #ifndef __BIT_ARRAY__ -#include "bitsop.h" +#include "bitarr.h" #endif #ifndef __BITS__ -#include "bitarr.h" +#include "bitsop.h" #endif +#include +#include +#include + #define ITERATE_BITMAP_BEGIN(bitmap_ptr ,bit_state) \ { \ char *ptr = bitmap_ptr->array; \ @@ -47,7 +51,7 @@ #define ITERATE_BITMAP_END(bitmap_ptr ,bit_state) }}} bool -bitmap_is_full(bit_arrya_t *bitmap); +bitmap_is_full(bit_array_t *bitmap); bool bitmap_pattern_match(bit_array_t *bitmap,char *binary_string,int n_bits,int *i); diff --git a/Assignment5/bitmap.h~ b/Assignment5/bitmap.h~ deleted file mode 100644 index 05f01d1..0000000 --- a/Assignment5/bitmap.h~ +++ /dev/null @@ -1,41 +0,0 @@ -/* - * ===================================================================================== - * - * Filename: bitmap.h - * - * Description: - * - * Version: 1.0 - * Created: 23/02/24 07:42:05 PM IST - * Revision: none - * Compiler: gcc - * - * Author: YOUR NAME (), - * Organization: - * - * ===================================================================================== - */ - -#ifndef __BITMAP_H_ -#define __BITMAP_H_ - -#ifndef __BIT_ARRAY__ -#include "bitsop.h" -#endif - -#ifndef __BITS__ -#include "bitarr.h" -#endif - -#define ITERATE_BITMAP_BEGIN(bitmap_ptr ,bit_state) \ - char *ptr = bitmap_ptr-> - -#define ITERATE_BITMAP_END(bitmap_ptr ,bit_state) - -bool -bitmap_is_full(bit_arrya_t *bitmap); - -bool -bitmap_pattern_match(bit_array_t *bitmap,char *binary_string,int n_bits,int *i); - -#endif diff --git a/Assignment5/bitsop.c b/Assignment5/bitsop.c index 329c91b..0ba0654 100644 --- a/Assignment5/bitsop.c +++ b/Assignment5/bitsop.c @@ -16,6 +16,7 @@ * ===================================================================================== */ +#include "bitsop.h" uint8_t count_bit_set(uint32_t n){ uint8_t bit_cnt = 0; diff --git a/Assignment5/solution.c b/Assignment5/solution.c deleted file mode 100644 index 66bada4..0000000 --- a/Assignment5/solution.c +++ /dev/null @@ -1,226 +0,0 @@ -#include -#include -#include -#include -#include - -/* Visit website : https://csepracticals.wixsite.com/csepracticals - * Use following Links to verify the results : - * Link 1 : http://www.silisoftware.com/tools/ipconverter.php - * Link 2 : http://jodies.de/ipcalc - * - * Solution to Assignment - * Level : Intermediate to Advanced, not for Beginner Programmers - * - * How to compile and run : - * Compile : gcc -g -c solution.c -o solution.o - * Link : gcc -g solution.o -o solution -lm - * Run : ./solution - * */ - -/*Bit Wise operations - * - * You must be familiar with Bitwise operations done - * in C. Please understand the below Macros - * */ - -/*You must know the concept of Big endian and Little Endian Machines - * and what is the purpose of htonl and ntohl - Important*/ - -/*Standard Functions suchs as inet_pton and inet_ntop have been used to - * make life easier. Understand the use of this Function. Google them.*/ - - -/*If you dont understand this assignment solution, you need to work on - * your C language*/ - -#define IS_BIT_SET(n, pos) ((n & (1 << (pos))) != 0) -#define TOGGLE_BIT(n, pos) (n = n ^ (1 << (pos))) -#define COMPLEMENT(num) (num = num ^ 0xFFFFFFFF) -#define UNSET_BIT(n, pos) (n = n & ((1 << pos) ^ 0xFFFFFFFF)) -#define SET_BIT(n, pos) (n = n | 1 << pos) - - -#define PREFIX_LEN 15 /*Max length of IP address in A.B.C.D format*/ -#define MAX_MASK_LEN 32 /*Maximum mask value in decimal notation*/ - -/*For example, if mask = 24 is passed as an argument, - * function should return an unsigned integer equivalent to - * below bit settings - * 11111111 11111111 11111111 00000000 - * */ -static unsigned int -get_mask_value_in_integer_format(char mask_value){ - - unsigned int mask = 0xFFFFFFFF; - char n_trail_bits = MAX_MASK_LEN - mask_value; - int i = 0; - for(; i < n_trail_bits; i++){ - UNSET_BIT(mask, i); - } - return mask; -} - -void -get_broadcast_address(char *ip_addr, - char mask, - char *output_buffer){ - - unsigned int ip_addr_integer = 0; - - /*Convert ip address from A.B.C.D format to equivalent unsigned integer*/ - inet_pton(AF_INET, ip_addr, &ip_addr_integer); - /* To understand below line, you need to google - * Little endian and big endian concept*/ - ip_addr_integer = htonl(ip_addr_integer); - - unsigned int mask_integer_format = get_mask_value_in_integer_format(mask); - /*if mask_integer_format = 11111111 11111111 11111111 00000000, then below - * fn would return 00000000 00000000 00000000 11111111*/ - COMPLEMENT(mask_integer_format); /*Revere the bits*/ - /*now, Perform OR-ing*/ - unsigned int broadcast_addr = ip_addr_integer | mask_integer_format; - broadcast_addr = htonl(broadcast_addr); - /*convert the broadcast address from interger to A.B.C.D format*/ - inet_ntop(AF_INET, &broadcast_addr, output_buffer, PREFIX_LEN + 1); - output_buffer[PREFIX_LEN] = '\0'; -} - -unsigned int -get_ip_integer_equivalent(char *ip_address){ - - unsigned int ip_addr_integer = 0; - /*Convert ip address from A.B.C.D format to equivalent unsigned integer*/ - inet_pton(AF_INET, ip_address, &ip_addr_integer); - return htonl(ip_addr_integer); -} - -void -get_abcd_ip_format(unsigned int ip_address, - char *output_buffer){ - - /*Convert an ip address from Integer to A.B.C.D format*/ - inet_ntop(AF_INET, &ip_address, output_buffer, PREFIX_LEN + 1); - output_buffer[PREFIX_LEN] = '\0'; -} - -/*Follow the steps explained in the course*/ -void -get_network_id(char *ip_address, char mask, char *output_buffer){ - - unsigned int mask_integer_format = get_mask_value_in_integer_format(mask); - unsigned int ip_address_integer = 0 ; - inet_pton(AF_INET, ip_address, &ip_address_integer); - unsigned int network_id = ip_address_integer & mask_integer_format; - network_id = htonl(network_id); - inet_ntop(AF_INET, &network_id, output_buffer, PREFIX_LEN + 1); -} - -unsigned int -get_subnet_cardinality(char mask_value){ - - return pow(2, MAX_MASK_LEN - mask_value) -2 ; -} - -/*Follow the steps explained in the course*/ -int /*Return 0 if true, -1 if false*/ -check_ip_subnet_membser_ship(char *network_id, - char mask, - char *check_ip){ - - unsigned int check_ip_integer = 0; - inet_pton(AF_INET, check_ip, &check_ip_integer); - unsigned int mask_integer = get_mask_value_in_integer_format(mask); - unsigned int calculated_nw_id = check_ip_integer & mask_integer; - unsigned int network_id_integer = 0; - inet_pton(AF_INET, network_id, &network_id_integer); - if(network_id_integer == check_ip_integer) - return 0; - return -1; -} - -int -main(int argc, char **argv){ - -/*Testing get_broadcast_address()*/ -{ - printf("Testing Q1..\n"); - char ip_address[PREFIX_LEN + 1], - output_buffer[PREFIX_LEN + 1]; - memset(ip_address, 0, PREFIX_LEN + 1); - memcpy(ip_address, "192.168.2.10", strlen("192.168.2.10")); - ip_address[strlen(ip_address)] = '\0'; - char mask = 24; - memset(output_buffer, 0 , PREFIX_LEN + 1); - get_broadcast_address(ip_address, mask, output_buffer); - printf("broadcast address = %s\n", output_buffer); - printf("Testing Q1 Done.\n"); -} - -/*Testing get_ip_integer_equivalent()*/ -{ - printf("Testing Q2..\n"); - char ip_address[PREFIX_LEN + 1]; - memset(ip_address, 0, PREFIX_LEN + 1); - memcpy(ip_address, "192.168.2.10", strlen("192.168.2.10")); - ip_address[strlen(ip_address)] = '\0'; - unsigned int a = get_ip_integer_equivalent(ip_address); - printf("a = %u\n", a); - printf("Testing Q2 Done.\n"); -} - - -/*Testing get_abcd_ip_format()*/ -{ - char output_buffer[PREFIX_LEN + 1]; - memset(output_buffer, 0 , PREFIX_LEN + 1); - unsigned int a = 2058138165; - printf("Testing Q3..\n"); - get_abcd_ip_format(htonl(a), output_buffer); - printf("IP address in A.B.C.D format = %s\n", output_buffer); - printf("Testing Q3 Done.\n"); -} - - -/*Testing get_network_id()*/ -{ - printf("Testing Q4..\n"); - char ip_address[PREFIX_LEN + 1], - output_buffer[PREFIX_LEN + 1]; - memset(ip_address, 0, PREFIX_LEN + 1); - memcpy(ip_address, "192.168.2.10", strlen("192.168.2.10")); - ip_address[strlen(ip_address)] = '\0'; - char mask = 20; - memset(output_buffer, 0 , PREFIX_LEN + 1); - get_network_id(ip_address, mask, output_buffer); - printf("Network Id = %s/%u\n", output_buffer, mask); - printf("Testing Q4 Done.\n"); -} - -/*Testing get_subnet_cardinality() */ -{ - printf("Testing Q5..\n"); - char mask = 24; - printf("Cardinality = %u\n", get_subnet_cardinality(mask)); - printf("Testing Q5 Done.\n"); -} - -{ -/*Testing check_ip_subnet_membser_ship()*/ - printf("Testing Q6..\n"); - char network_id[PREFIX_LEN + 1]; - strncpy(network_id, "192.168.1.0", strlen("192.168.1.0")); - network_id[PREFIX_LEN] = '\0'; - - char mask = 24; - - char ip_address[PREFIX_LEN + 1]; - strncpy(ip_address, "192.168.1.10", strlen("192.168.1.10")); - - int res = check_ip_subnet_membser_ship(network_id, mask, ip_address); - printf("IP Subnet check Result = %s\n", res == 0 ? "Membership true": "Membership false"); - printf("Testing Q6 Done.\n"); -} - - return 0; -}