C1R Implementation: Difference between revisions
Content added Content deleted
(Special treatment for the Quine task) |
imported>Katsumi No edit summary |
||
(2 intermediate revisions by one other user not shown) | |||
Line 5: | Line 5: | ||
The "Quine" task required special treatment. |
The "Quine" task required special treatment. |
||
< |
<syntaxhighlight lang="bash">#! /bin/bash |
||
# C1R compiler |
# C1R compiler |
||
Line 17: | Line 17: | ||
# unescape HTML codes: replace "<" by "<" etc |
# unescape HTML codes: replace "<" by "<" etc |
||
function unescapeHTML() { |
function unescapeHTML() { |
||
sed -e 's/<\;/</g;s/>\;/>/g;s/ \;/ /g;s/"\;/"/g;s/(\;/(/g;s/)\;/)/g;s/[\;/[/g;s/]\;/]/g;s/{\;/{/g;s/}\;/}/g' |
sed -e 's/<\;/</g;s/>\;/>/g;s/ \;/ /g;s/ \;/ /g;s/ \;/ /g;s/"\;/"/g;s/(\;/(/g;s/)\;/)/g;s/[\;/[/g;s/]\;/]/g;s/{\;/{/g;s/}\;/}/g' |
||
} |
} |
||
Line 50: | Line 50: | ||
cc $FILENAME1 |
cc $FILENAME1 |
||
</syntaxhighlight> |
|||
</lang> |
|||
A typical test session would look like: |
A typical test session would look like: |
||
< |
<syntaxhighlight lang="bash"> |
||
$ echo Hello_world/Text >hw.c1r |
$ echo Hello_world/Text >hw.c1r |
||
$ ./c1r hw.c1r |
$ ./c1r hw.c1r |
||
$ ./a.out |
$ ./a.out |
||
Goodbye, World! |
Goodbye, World! |
||
</syntaxhighlight> |
|||
</lang> |
Latest revision as of 14:04, 25 August 2023
C1R Implementation is an implementation of C1R.
Other implementations of C1R.
c1r is the implementation for the C1R language on Unix machines; porting to Windows and other platforms should be fairly easy.
In fact c1r is a simple shell script that efficiently uses the already available C compiler named cc. The "Quine" task required special treatment.
#! /bin/bash
# C1R compiler
# remove HTML tags, but replace "<br />" by newlines
function removeHTMLtags() {
sed -e 's~<br */>~\
~g' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
}
# unescape HTML codes: replace "<" by "<" etc
function unescapeHTML() {
sed -e 's/<\;/</g;s/>\;/>/g;s/ \;/ /g;s/ \;/ /g;s/ \;/ /g;s/"\;/"/g;s/(\;/(/g;s/)\;/)/g;s/[\;/[/g;s/]\;/]/g;s/{\;/{/g;s/}\;/}/g'
}
FILENAME=$1
if [ -z ${FILENAME} ]
then
echo "Usage: $0 <fileName>"
exit 1
fi
FILENAME1=${FILENAME}.c
ROSETTAURL=rosettacode.org/wiki
WORDCOUNT=`cat $FILENAME|wc -l`
cp ${FILENAME} ${FILENAME1}
if [ $WORDCOUNT -eq 1 ]
then
# Note: the self-printing Quine program requires special treatment
if [ `cat $FILENAME` = "Quine" ]
then
cat << EOF > $FILENAME1
#include <stdio.h>
int main(char args[]) {printf("Quine\\n");}
EOF
else
PAGEURL=$ROSETTAURL/`cat $FILENAME`
curl $PAGEURL 2>/dev/null | grep -m 1 "<pre class=\"c highlighted_source\">" | removeHTMLtags | unescapeHTML >${FILENAME1}
fi
fi
cc $FILENAME1
A typical test session would look like:
$ echo Hello_world/Text >hw.c1r
$ ./c1r hw.c1r
$ ./a.out
Goodbye, World!