User Tools

Site Tools


haas:fall2017:discrete:projects:bdt1

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
haas:fall2017:discrete:projects:bdt1 [2017/10/02 15:24] – [Experiencing xxd] wedgehaas:fall2017:discrete:projects:bdt1 [2017/10/19 14:28] (current) wedge
Line 3: Line 3:
 <WRAP><fs 150%>CSCS2330 Discrete Structures</fs></WRAP> <WRAP><fs 150%>CSCS2330 Discrete Structures</fs></WRAP>
 </WRAP> </WRAP>
- 
-~~TOC~~ 
  
 ======Project: Binary Data Tool (bdt1)====== ======Project: Binary Data Tool (bdt1)======
Line 56: Line 54:
 So these **bdt#** projects are a specific foray into this special case study of writing our own custom tool that can get a certain job done, faster. Reducing OUR particular need to keep tabs on something the computer is very much better at doing. So these **bdt#** projects are a specific foray into this special case study of writing our own custom tool that can get a certain job done, faster. Reducing OUR particular need to keep tabs on something the computer is very much better at doing.
  
-=====Detecting Terminal Size===== +=====Implementation Restrictions=====
-To detect the current size of your terminal, you may make use of the following code, provided in the form of a complete program for you to test, and then adapt into your code as appropriate.+
  
-It makes use of a pre-existing **structure**, which when properly populated with an **ioctl()** callyou have the information you need to proceed (we're just using it to retrieve information to help us on our program).+As our goal is not only to explore the more subtle concepts of computing but to promote different methods of thinking (and arriving at solutions seemingly in different ways), one of the themes I have been harping on is the stricter adherence to the structured programming philosophy. It isn'just good enough to be able to crank out a solution if you remain blind to the many nuances of the tools we are using, so we will at times be going out of our way to emphasize focus on certain areas that may see less exposure (or avoidance due to it being less familiar).
  
-<code c> +As such, the following implementation restrictions are also in place:
-#include <stdio.h> +
-#include <stdlib.h> +
-#include <sys/ioctl.h>+
  
-int main (void+  * use any **break** or **continue** statements sparingly. I am not forbidding their use, but I also don't want this to turn into a lazy solution free-for-all. I am letting you use them, but with **justification**. 
-{ +  * absolutely **NO** infinite loops (**while(1)**). 
-    struct winsize terminal; +  * no forced redirection of the flow of the process (no seeking to the end of the file to grab a max size only to zip back somewhere else: deal with the data in as you are naturally encountering it). 
-    ioctl  (0, TIOCGWINSZ, &terminal);+  * All "arrays" must be declared and referenced using ONLY pointer notation, NO square brackets. 
 +  * **NO** logic shunts (ie having an if statement nested inside a loop to bypass an undesirable iteration)- this should be handled by the loop condition!
  
-    printf ("lines:   %d\n"terminal.ws_row); +BasicallyI am going loosen my implementation restriction grip for this projectI would like you NOT to disappoint meWrite clean, effective code... show me that you have learned something from this class.
-    printf ("columns%d\n", terminal.ws_col); +
-    return (0); +
-+
-</code>+
  
-An **ioctl(2)** is method (and system/library call) for manipulating underlying device parameters of special files (for the UNIX people: everything is a file, including your keyboard, and **terminal screen**)We are basically querying the screen (or accessing lower level information made possible by communicating with the driver of the device) to obtain some useful information. If you've ever wondered how drivers work- this **ioctl()** functionality can be rather central to the whole process (basicallyreading or writing bytes at specific memory addresses).+=====Program Specifications===== 
 +For this project, I am looking for minimum subset of functionalityBut there are many potential improvements that can be madewhich I would consider for bonus points.
  
-Here we are accessing the information on our terminal file, retrieving the width and height so that we can make use of them productively in our programs.+====Basic functionality==== 
 +Your program should:
  
-Compile and run the above code to see how it works. Try it in different size terminals. Then incorporate the logic into your hex viewer for this project.+  * accept two files as command-line arguments (these would be the files you'd like to compare) 
 +  * display the address/offset on the left just as **xxd(1)** does 
 +  * display the row preceding the first identified byte of difference for the first, then second file 
 +  * display the row containing (and coloring/highlighting) the identified byte of difference for the first, then second file 
 +  * display the row following the identified byte of difference for the first, then second file
  
-=====Selection highlighting===== +The focus is the FIRST byte of difference. The algorithm could get considerably trickier when dealing with additional differences (especially if extra bytes are involved in the difference).
-The following adds a nice visual twist to things:+
  
-  * Enhance the program to accept pairs of additional values (offset followed by its length), where each offset through length will be colored using ANSI text escape sequences (for simplicity, you may highlight using the same color). +====Bonus opportunities==== 
-  * For any line containing this colorized text, highlight the address in bold white.+Some ideas to enhance your program for potential bonus points:
  
-====Sample output====+  * accept some sort of mode argument, a number, that would alter the behavior of your tool. Such as: 
 +    * 0: display as project specifies 
 +    * 1: display on separate lines, vs. the same line of difference (first file, newline, second file). 
 +    * additional modes as justified 
 +  * accept numeric offset arguments, 1 for each file, to instruct your tool where they should start reading/comparing 
 +    * this would be a way for your tool to natively support "additional" points of difference without needing an overly-complicated algorithm. You would be able to specify the starting points, from visual inspection on previous runs of the tool or **xxd(1)**, which would add considerable debugging value. 
 +    * this would likely require displaying the pertinent offsets for each file.  
 +  * you could endeavor to explore some algorithmic enhancements to automatically detect additional points of difference. Note that this could be rather fragile, depending on the identified differences.
  
-As an example, running the program with the following arguments could produce results like this: +=====Output===== 
- +A basic mockup (pictures coming soon) of desired output:
-{{:haas:fall2017:discrete:projects:bdt1.png?640|}} +
- +
-====ANSI escape sequences for color==== +
-This probably isn't very portable, and depending on the terminal, it may not work for some people. +
- +
-It may be most convenient to set up preprocessor #define statements near the top of your code, as follows: +
- +
-<code c> +
-#define  ANSI_RESET             "\x1b[0m" +
-#define  ANSI_BOLD              "\x1b[1m" +
-#define  ANSI_FG_BLACK          "\x1b[30m" +
-#define  ANSI_FG_RED            "\x1b[31m" +
-#define  ANSI_FG_GREEN          "\x1b[32m" +
-#define  ANSI_FG_YELLOW         "\x1b[33m" +
-#define  ANSI_FG_BLUE           "\x1b[34m" +
-#define  ANSI_FG_MAGENTA        "\x1b[35m" +
-#define  ANSI_FG_CYAN           "\x1b[36m" +
-#define  ANSI_FG_WHITE          "\x1b[37m" +
-#define  ANSI_BG_BLACK          "\x1b[40m" +
-#define  ANSI_BG_RED            "\x1b[41m" +
-#define  ANSI_BG_GREEN          "\x1b[42m" +
-#define  ANSI_BG_YELLOW         "\x1b[43m" +
-#define  ANSI_BG_BLUE           "\x1b[44m" +
-#define  ANSI_BG_MAGENTA        "\x1b[45m" +
-#define  ANSI_BG_CYAN           "\x1b[46m" +
-#define  ANSI_BG_WHITE          "\x1b[47m" +
-</code> +
- +
-To use, you output them: +
- +
-<code> +
-fprintf(stdout, ANSI_FG_GREEN); +
-fprintf(stdout, "This text is green\n"); +
-fprintf(stdout, ANSI_RESET); +
-</code> +
- +
-You have to remember to turn the color or setting off (resetting it) to revert back to the original color. +
- +
-You can mix and match as well: +
- +
-<code> +
-fprintf(stdout, ANSI_FG_YELLOW); +
-fprintf(stdout, ANSI_BG_BLUE); +
-fprintf(stdout, ANSI_BOLD); +
-fprintf(stdout, "This text is bold yellow on blue\n"); +
-fprintf(stdout, ANSI_RESET); +
-</code> +
- +
-While there are 8 available foreground colors, bolding can double that range to 16. +
- +
-=====Implementation Restrictions===== +
- +
-As our goal is not only to explore the more subtle concepts of computing but to promote different methods of thinking (and arriving at solutions seemingly in different ways), one of the themes I have been harping on is the stricter adherence to the structured programming philosophy. It isn't just good enough to be able to crank out a solution if you remain blind to the many nuances of the tools we are using, so we will at times be going out of our way to emphasize focus on certain areas that may see less exposure (or avoidance due to it being less familiar). +
- +
-As such, the following implementation restrictions are also in place: +
- +
-  * absolutely **NO** switch/case, **continue**, **break**, nor other non-structured program flow alteration (jumps, gotos, etc.) +
-  * absolutely **NO** infinite loops (**while(1)**, which are more-or-less unviable anyway if you cannot **break** out of them). +
-  * no forced redirection of the flow of the process (no seeking to the end of the file to grab a max size only to zip back somewhere else: deal with the data in as you are naturally encountering it). +
-  * With the exception of any negative values, all numbers should be transacted in hexadecimal (as in the values you assign and compare and manipulate in your code). +
-  * No line must exceed 80 characters in width. +
-  * All "arrays" must be declared and referenced using ONLY pointer notation, NO square brackets. +
-  * For the highlighted address and lengths, store them in an array of structs (containing the //address// and //length// members). +
-  * **NO** logic shunts (ie having an if statement nested inside a loop to bypass an undesirable iteration)- this should be handled by the loop condition!+
  
 +<cli>
 +lab46:~/src/discrete/bdt1$ ./bdt1 in/sample0.txt in/sample0.off
 +0000090: 0011 2233 4455 6677 8899 aabb ccdd eeff | 0011 2233 4455 6677 8899 aabb ccdd eeff
 +00000a0: 55aa 66bb 0401 77cc 88dd 99ee aaff 89af | 55aa 66bb 0501 77cc 88dd 99ee aaff 89af
 +00000b0: 9988 7766 5544 3322 1100 ffee ddcc bbaa | 9988 7766 5544 3322 1100 ffee ddcc bbaa
 +lab46:~/src/discrete/bdt1$ 
 +</cli>
 =====Submission===== =====Submission=====
 To successfully complete this project, the following criteria must be met: To successfully complete this project, the following criteria must be met:
haas/fall2017/discrete/projects/bdt1.1506957857.txt.gz · Last modified: 2017/10/02 15:24 by wedge