almost done with utilities proj; small edits to main README

This commit is contained in:
Remzi Arpaci-Dusseau
2018-01-17 16:50:20 -08:00
parent 9377880201
commit 063ff4c68c
3 changed files with 113 additions and 24 deletions

View File

@@ -23,6 +23,8 @@ journey; you'll have to do more on your own to truly become proficient.
## Processes
* Shell
## Virtual Memory

View File

@@ -0,0 +1,7 @@
## my-sort
**Details**
## my-uniq
**Details**

View File

@@ -33,7 +33,7 @@ specified by the user and prints its contents. A typical usage is as follows,
in which the user wants to see the contents of main.c, and thus types:
```
prompt> my-cat main.c
prompt> ./my-cat main.c
#include <stdio.h>
...
```
@@ -110,8 +110,6 @@ then exits with error status of 1. In UNIX systems, it is traditional to
return 0 upon success, and non-zero upon failure. Here, we will use 1 to
indicate failure.
Side note: if **fopen()** does fail, there are many reasons possible as to
why. You can use the functions **perror()** or **strerror()** to print out
more about *why* the error occurred; learn about those on your own (using
@@ -121,8 +119,6 @@ Once a file is open, there are many different ways to read from it. The one
we're suggesting here to you is **fgets()**, which is used to get input from
files, one line at a time.
XXX.
To print out file contents, just use **printf()**. For example, after reading
in a line with **fgets()** into a variable **buffer**, you can just print out
the buffer as follows:
@@ -139,38 +135,122 @@ course, many include a newline).
Finally, when you are done reading and printing, use **fclose()** to close the
file (thus indicating you no longer need to read from it).
### my-cat: Details
**Details**
* Your program **my-cat** can be invoked with one or more files on the command
line; it should just print out each in turn.
* If *no files* are specified on the command line, **my-cat** should instead
read from *standard input*. That is, you can read from the already opened
FILE pointer called **stdin** instead of reading from **fp** that you got by
opening a file. Note: you do not need to open anything in this case.
line; it should just print out each file in turn.
* In all non-error cases, **my-cat** should exit with status code 0, usually by
returning a 0 from **main()**.
* If *no files* are specified on the command line, **my-cat** should just exit
and return 0. Note that this is slightly different than the behavior of
normal UNIX **cat** (if you'd like to, figure out the difference).
* If the program tries to **fopen()** a file and fails, it should print the
exact message "my-cat: cannot open file" and exit with status code 1.
* In all other cases, **my-cat** should exit with status code 0, usually by
returning a 0 from **main()**.
If multiple files are specified on the command line, the files should
be printed out in order until the end of the file list is reached or
an error opening a file is reached (at which point the error message
is printed and **my-cat** exits).
## my-grep
The second utility you will build is called **my-grep**.
The second utility you will build is called **my-grep**, a variant of the UNIX
tool **grep**. This tool looks through a file, line by line, trying to find a
user-specified search term in the line. If a line has the word within it, the
line is printed out, otherwise it is not.
Here is how a user would look for the term **foo** in the file **bar.txt**:
```
prompt> ./my-grep foo bar.txt
this line has foo in it
so does this foolish line; do you see where?
even this line, which has barfood in it, will be printed.
```
**Details**
* Your program **my-grep** is always passed a search term and zero or
more files to grep through. It should go through each line and see if
the search term is in it; if so, the line should be printed, and if not,
the line should be skipped.
* The matching is case sensitive. Thus, if searching for **foo**, lines
with **Foo** will *not* match.
* Lines can be arbitrarily long (that is, you may see many many characters
before you encounter a newline character, \\n). **my-grep** should work
as expected even with very long lines.
* If **my-grep** is passed no command-line arguments, it should print
"my-grep: searchterm [file ...]" and exit with status 1.
* If **my-grep** encounters a file that it cannot open, it should print
"my-grep: cannot open file" and exit with status 1.
* In all other cases, **my-grep** should exit with return code 0.
* If a search term, but no file, is specified, **my-grep** should work,
but instead of reading from a file, **my-grep** should read from
*standard input*. Doing so is easy, because the file stream **stdin**
is already open; you can use **fgets()** (or similar routines) to
read from it.
## my-zip and my-unzip
## my-sort
The next tools you will build come in a pair, because one (**my-zip**) is a
file compression tool, and the other (**my-unzip**) is a file decompression
tool.
The type of compression used here is a simple form of compression called
*run-length encoding* (*RLE*). RLE is quite simple: when you encounter **n**
characters of the same type in a row, the compression tool (**my-zip**) will
turn that into the number **n** and a single instance of the character.
Thus, if we had a file with the following contents:
```
aaaaaaaaaabbbb
```
the tool would turn it (logically) into:
```
10a4b
```
However, the exact format of the compressed file is quite important; here,
you will write out a 4-byte integer in binary format followed by the single
character in ASCII. Thus, a compressed file will consist of some number of
5-byte entries, each of which is comprised of a 4-byte integer (the run
length) and the single character.
To write out an integer in binary format (not ASCII), you should use
**fwrite()**. Read the man page for more details. For **my-zip**, all
output should be written to standard output (the **stdout** file stream,
which, as with **stdin**, is already open when the program starts running).
Note that typical usage of the **my-zip** tool would thus use shell
redirection in order to write the compressed output to a file. For example,
to compress the file **file.txt** into a (hopefully smaller) **file.z**,
you would type:
```
prompt> ./my-zip file.txt > file.z
```
The **my-unzip** tool simply does the reverse of the **my-zip** tool, taking
in a compressed file and writing (to standard output again) the uncompressed
results. For example, to see the contents of **file.txt**, you would type:
```
prompt> ./my-unzip file.z
```
**my-unzip** should read in the compressed file (likely using **fread()**)
and print out the uncompressed output to standard output using **printf()**.
**Details**
* Correct invocation should pass one or more files via the command line to the
program.
*
*
*
*
## my-uniq