cs-3424: finish lab2

This commit is contained in:
Price Hiller 2024-06-23 04:09:55 -05:00
parent 54785f2bac
commit aca6abf2ef
Signed by: Price
GPG Key ID: C3FADDE7A8534BEB
3 changed files with 250 additions and 0 deletions

View File

@ -0,0 +1,158 @@
#set text(font: "FreeSans")
#set page(margin: 1cm)
#show link: item => [
#text(blue)[#item]
]
#show raw: set text(font: "Fira Code")
#show raw.where(block: true): item => {
set par(leading: .5em)
text(size: 0.9em)[#block(
inset: 4pt,
stroke: luma(40%) + .5pt,
fill: luma(97%),
radius: 3pt,
)[#item]]
}
#let comment(com) = {
text(size: 0.85em, style: "italic", fill: rgb(64, 90, 95))[#com]
}
#let answer(ans) = {
align(center)[#block(
inset: 4pt,
stroke: blue + .5pt,
fill: rgb(0, 149, 255, 5%),
radius: 3pt,
)[#ans]]
}
#align(center)[#text(size: 1.3em)[= CS 3424 Quiz - Week 3]]
#align(center)[
#("Price Hiller", "zfp106", "Quiz 2", "CS 3424").join(" ⋄ ")
#v(-.5em)
#text(size: 0.75em)[#block(
inset: 4pt,
radius: 1pt,
stroke: luma(40%) + .2pt,
width: 40%,
fill: luma(97%),
)[#par(leading: .4em)[If you are interested in viewing the source code of this document, you can do so
by clicking #link("https://git.orion-technologies.io/Price/college/src/branch/Development/Summer-2024/CS-3424/Quizzes/Quiz-2/Assignment.typ", "here.")]]]
#v(-.5em)
#line(length: 100%, stroke: (dash: "densely-dotted"))
#v(-.5em)
]
1. Create a shell script which prints only the even lines from an input file. Assume the first line is line 1. At the end of the script, if the total number of lines is greater than 10, print "big". Otherwise, print "small".
#answer[
#comment[Here is the "simpler" way of doing this, only accepting a single file to be read from as an argument and little to no validation.]
```bash
#!/usr/bin/env bash
set -eEou pipefail
main() {
local input="${1}"
local line_count=0
while read -r line; do
# To satisfy the `set -u` incantation at the top, we have to assign the variable instead of
# a simple ((line_count++))
line_count=$((line_count + 1))
if ((line_count % 2 == 0)); then
printf "%s\n" "$line"
fi
done <"$input"
if ((line_count > 10)); then
printf "big\n"
else
printf "small\n"
fi
}
main "${@}"
```
#comment[See the next page for a more comprehensive approach.]
]
#pagebreak()
#answer[
#comment[Below is the more comprehensive way of doing this, including support for STDIN (which you can argue _is_ in fact an "input file").]
```bash
#!/usr/bin/env bash
set -eEou pipefail
die() {
printf "%s\n" "${*}"
exit 1
}
usage() {
local script
script="$(basename "${0}")"
cat <<-__EOS__
==== USAGE ====
Provide a file:
${script} ./some/path/to/a/file
Pipe from stdin:
echo "hello\nworld!" | ${script}
Redirect from stdin:
${script} < ./some/path/to/a/file
==== USAGE ====
__EOS__
}
handle_lines() {
local input="${1}"
local line_count=0
while read -r line; do
# To satisfy the `set -u` incantation at the top, we have to assign the variable instead of
# a simple ((line_count++))
line_count=$((line_count + 1))
if ((line_count % 2 == 0)); then
printf "%s\n" "$line"
fi
done <"$input"
if ((line_count > 10)); then
printf "big\n"
else
printf "small\n"
fi
}
main() {
# Check if we should read from stdin or a given file
if [[ -t 0 ]]; then
# Input should be a path to a file
set +u
if [[ -z "${1}" ]]; then
usage
die "No input received!"
fi
set -u
local fpath="${1}"
if ! [[ -r "$fpath" ]]; then
die "Unable to read a file at: ${fpath}"
fi
handle_lines "$fpath"
else
# Read from stdin
handle_lines "/dev/stdin"
fi
}
main "${@}"
```
]

View File

@ -0,0 +1,68 @@
#!/usr/bin/env bash
set -eEou pipefail
die() {
printf "%s\n" "${*}"
exit 1
}
usage() {
local script
script="$(basename "${0}")"
cat <<-__EOS__
==== USAGE ====
Provide a file:
${script} ./some/path/to/a/file
Pipe from stdin:
echo "hello\nworld!" | ${script}
Redirect from stdin:
${script} < ./some/path/to/a/file
==== USAGE ====
__EOS__
}
handle_lines() {
local input="${1}"
local line_count=0
while read -r line; do
# To satisfy the `set -u` incantation at the top, we have to assign the variable instead of
# a simple ((line_count++))
line_count=$((line_count + 1))
if ((line_count % 2 == 0)); then
printf "%s\n" "$line"
fi
done <"$input"
if ((line_count > 10)); then
printf "big\n"
else
printf "small\n"
fi
}
main() {
# Check if we should read from stdin or a given file
if [[ -t 0 ]]; then
# Input should be a path to a file
set +u
if [[ -z "${1}" ]]; then
usage
die "No input received!"
fi
set -u
local fpath="${1}"
if ! [[ -r "$fpath" ]]; then
die "Unable to read a file at: ${fpath}"
fi
handle_lines "$fpath"
else
# Read from stdin
handle_lines "/dev/stdin"
fi
}
main "${@}"

View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -eEou pipefail
main() {
local input="${1}"
local line_count=0
while read -r line; do
# To satisfy the `set -u` incantation at the top, we have to assign the variable instead of
# a simple ((line_count++))
line_count=$((line_count + 1))
if ((line_count % 2 == 0)); then
printf "%s\n" "$line"
fi
done <"$input"
if ((line_count > 10)); then
printf "big\n"
else
printf "small\n"
fi
}
main "${@}"