User Tools

Site Tools


notes:sysprog:projects:wut1

SYSPROG PROJECT: Writing Unix Tools (wut1)

OBJECTIVE

To apply your burgeoning sysprog skills in the writing of familiar and described UNIX tools.

GRABIT

I have rigged up a grabit for wut1, which contains a directory structure, some useful Makefiles, and a header file to assist you in the development process.

PROGRAM

It is your task to implement getopt(3)-style command-line arguments and ensure functionality for the following tools (pick one, but your one must be unique; each person is doing a different one). You may choose to do others for potential bonus point considerations.

The programs are (edit the appropriate section and record your name to claim it; once someone has claimed a program, it is considered unavailable for others in the class to do for core credit):

command-line arguments

All of the programs should accept the following command-line arguments (check for program-specific additional ones as well in the appropriate section):

  • -h display usage information and exit
  • -V display version information and exit
  • -s “STRING” specify STRING as value to process
  • -4 set nibble as processing unit/word size
  • -7 set byte/word as 7-bits
  • -8 set byte/word as 8-bits (default)
  • -n no delimiter between processing units
  • -d 'CHAR' use CHAR as delimiter between processing units (space is default)
  • -q quiet, do not display anything to STDOUT
  • -v verbose, display more information to STDOUT

general program processing/usage

usage: the program takes delimiter-separated numeric values via specified filename, or as a string communicated via the command-line, or from STDIN, converts them and then displays the result as appropriate for the particular tool (considering delimited output as well; delimiter is set to a single space by default). The program terminates upon exhausting all of its input.

compiling

The Makefiles are set up for this, but you are basically to compile each program with the following compiler options:

  • -Wall increased warning pickiness/verbosity
  • -Werror treat warnings as errors
  • –std=c99 compile with C99 language standards

binary.c

 binary.c - program to display hex numbers in their
            binary representation.

  synopsis: binary [OPTION]... [FILE]...

   execute: binary -s "de ad be ef 00 01 5a"
        or: echo "de ad be ef 00 01 5a" | binary

Additional Command-line arguments to implement:

  • -B input data is to be considered as binary (basically a passthrough)
  • -O input data is to be considered as octal
  • -D input data is to be considered as decimal
  • -H input data is to be considered as hexadecimal (default)

Claimed by: Christian Cattell (ccattell)

parity.c

 parity.c - program to check the parity (odd, even, none)
            of input binary values.

  synopsis: parity PARITYOPTION [OPTION]... [FILE]...

   execute: parity -O -s "10110010"
        or: echo "10110010" | parity -E

Additional Command-line arguments to implement:

  • -O odd parity
  • -E even parity
  • -N no parity

Lack of one of these options should generate an error.

Claimed by:Jeff Jansen

endian.c

endian.c  - program to encode value(s) according to
            an indicated endianness.

  synopsis: endian [OPTION]... [FILE]...

   execute: endian -s "dead beef" -e -w 16 -b 16
        or: echo "de ad be ef" | endian -E -b 16

Additional Command-line arguments to implement:

  • -w # set wordsize (power of 2 between 4 and 128, 8 is default)
  • -u also consider underlying bytes in endianness encoding
  • -E encode as big endian
  • -e encode as little endian (default)
  • -b BASE input/output base (of 2, 8, 10, or 16; base 2 is default)

Your program can indicate a “setting not supported” message (and exit) if the -7 argument is specified.

The -4 and -8 arguments are equivalent to -w 4 and -w 8, respectively.

Claimed by: Dillon Vargeson(dvarges3)

checksum.c

checksum.c - program to calculate checksum
             of provided values.

   synopsis: checksum [OPTION]... [FILE]...

    execute: checksum -b 16 -s "de ad be ef"
         or: echo "de ad be ef" | checksum -b 16

Additional Command-line arguments to implement:

  • -b BASE input/output base (of 2, 8, 10, or 16; base 2 is default)
  • -P perform parity word checksum
  • -S perform word sum checksum (default)

Claimed by:Patrick (phastin1)

twoscomp.c

twoscomp.c - program to calculate two's complement
             of provided values.

   synopsis: twoscomp [OPTION]... [FILE]...

    compile: gcc -o twoscomp twoscomp.c -Wall -Werror --std=c99
    execute: twoscomp -s "10011010"
         or: echo "11001011" | twoscomp

Additional Command-line arguments to implement:

  • -w # set wordsize (power of 2 between 4 and 128, 8 is default)
  • -b BASE input/output base (of 2, 8, 10, or 16; base 2 is default)

Claimed by: Ben Schultes (bschulte)

addition.c

addition.c - program to perform addition (without
             actually using any addition- only logic operations)
             on the input values.

   synopsis: addition [OPTION]... [FILE]...

    execute: addition -s "10011010 11010001"
         or: echo "11001011 00011101" | addition

Additional Command-line arguments to implement:

  • -b BASE input/output base (of 2, 8, 10, or 16; base 2 is default)
  • -C final carry out value is set to return value (otherwise return 0 on success)
  • -I # set an initial carry in value (defaults to 0)

Claimed by: Kris (kbeykirc)

bitmask.c

bitmask.c  - program to apply specified bitmask
             against set of input values.

   synopsis: bitmask -M BITMASK [OPTION]... [FILE]...

    execute: bitmask -M "10110111" -s "10011010 11010001"
         or: echo "11001011 00011101" | bitmask -M "10110101"

Additional Command-line arguments to implement:

  • -w # set wordsize (power of 2 between 4 and 128, 8 is default)
  • -b BASE input/output base (of 2, 8, 10, or 16; base 2 is default)
  • -M “BITMASK” specify bitmask value for processing (required)

Claimed by: Andrei Bratkovski (abratkov)

rotate.c

rotate.c   - program to perform a bit rotate
             against a set of input values.

   synopsis: rotate -L[#]|-R[#] [OPTION]... [FILE]...

    execute: rotate -L 3 -s "10011010 11010001"
         or: echo "1100101100011101" | rotate -W 16 -R

A bit rotate preserves bits, a bit shift discards bits.

Additional Command-line arguments to implement:

  • -w # set wordsize (power of 2 between 4 and 128)
  • -L # perform a left rotate operation (shift by # bits; 1 if not specified)
  • -R # perform a right rotate operation (shift by # bits; 1 if not specified)

Claimed by: Aaron Houghtaling (ahought2)

invert.c

invert.c   - program to perform a bit inversion
             against a set of input values (toggle all
             0s to 1s, and 1s to 0s).

   synopsis: invert [OPTION]... [FILE]...

    execute: invert -s "10011010 11010001"
         or: echo "1100101100011101" | invert

Word size doesn't really matter for invert. It is merely flipping bits, however many there are.

Additional Command-line arguments to implement:

  • -B input data is to be considered as binary (default)
  • -O input data is to be considered as octal
  • -D input data is to be considered as decimal
  • -H input data is to be considered as hexadecimal

Claimed by: Matthew Chon (mchon)

SPECIFICATIONS

You will be implementing in accordance to the following specifications:

  • well commented
    • top comment banner including compile and sample execution instructions (and description)
    • consistent presentation of comments throughout code identifying process particulars
  • consistently indented
  • getopt(3)-style command-line arguments
    • help/usage
  • implement described functionality
  • do reasonable error checking to ensure correct operation

SUBMISSION

Your standard submission logic applies:

lab46:~/src/sysprog/wut#$ make submit
...
notes/sysprog/projects/wut1.txt · Last modified: 2018/02/13 19:25 by wedge