aboutsummaryrefslogtreecommitdiffstats
path: root/awklib/eg/network
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2010-07-16 13:09:56 +0300
committerArnold D. Robbins <arnold@skeeve.com>2010-07-16 13:09:56 +0300
commitbc70de7b3302d5a81515b901cae376b8b51d2004 (patch)
treed36d6743e65697f6923b79d0ea8f9f9bf4ef7398 /awklib/eg/network
parentb9e4a1fd4c8c8753ab8a9887bab55f03efe1e3e2 (diff)
downloadegawk-bc70de7b3302d5a81515b901cae376b8b51d2004.tar.gz
egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.tar.bz2
egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.zip
Move to gawk-3.1.0.
Diffstat (limited to 'awklib/eg/network')
-rw-r--r--awklib/eg/network/PostAgent.sh9
-rw-r--r--awklib/eg/network/coreserv.awk113
-rw-r--r--awklib/eg/network/eliza.awk270
-rw-r--r--awklib/eg/network/fingerclient.awk7
-rw-r--r--awklib/eg/network/geturl.awk24
-rw-r--r--awklib/eg/network/hello-serv.awk14
-rw-r--r--awklib/eg/network/maze.awk73
-rw-r--r--awklib/eg/network/mobag.awk72
-rw-r--r--awklib/eg/network/panic.awk18
-rw-r--r--awklib/eg/network/protbase.awk11
-rw-r--r--awklib/eg/network/protbase.request7
-rw-r--r--awklib/eg/network/protbase.result9
-rw-r--r--awklib/eg/network/remconf.awk54
-rw-r--r--awklib/eg/network/statist.awk85
-rw-r--r--awklib/eg/network/stoxdata.txt4
-rw-r--r--awklib/eg/network/stoxpred.awk116
-rw-r--r--awklib/eg/network/testserv.awk12
-rw-r--r--awklib/eg/network/urlchk.awk28
-rw-r--r--awklib/eg/network/webgrab.awk6
19 files changed, 932 insertions, 0 deletions
diff --git a/awklib/eg/network/PostAgent.sh b/awklib/eg/network/PostAgent.sh
new file mode 100644
index 00000000..ccf9a687
--- /dev/null
+++ b/awklib/eg/network/PostAgent.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+MobAg=/tmp/MobileAgent.$$
+# direct script to mobile agent file
+cat > $MobAg
+# execute agent concurrently
+gawk -f $MobAg $MobAg > /dev/null &
+# HTTP header, terminator and body
+gawk 'BEGIN { print "\r\nAgent started" }'
+rm $MobAg # delete script file of agent
diff --git a/awklib/eg/network/coreserv.awk b/awklib/eg/network/coreserv.awk
new file mode 100644
index 00000000..e9e61710
--- /dev/null
+++ b/awklib/eg/network/coreserv.awk
@@ -0,0 +1,113 @@
+# CGI Library and core of a web server
+#
+# Juergen Kahrs, Juergen.Kahrs@vr-web.de
+# with Arnold Robbins, arnold@gnu.org
+# September 2000
+
+# Global arrays
+# GETARG --- arguments to CGI GET command
+# MENU --- menu items (path names)
+# PARAM --- parameters of form x=y
+
+# Optional variable MyHost contains host address
+# Optional variable MyPort contains port number
+# Needs TopHeader, TopDoc, TopFooter
+# Sets MyPrefix, HttpService, Status, Reason
+
+BEGIN {
+ if (MyHost == "") {
+ "uname -n" | getline MyHost
+ close("uname -n")
+ }
+ if (MyPort == 0) MyPort = 8080
+ HttpService = "/inet/tcp/" MyPort "/0/0"
+ MyPrefix = "http://" MyHost ":" MyPort
+ SetUpServer()
+ while ("awk" != "complex") {
+ # header lines are terminated this way
+ RS = ORS = "\r\n"
+ Status = 200 # this means OK
+ Reason = "OK"
+ Header = TopHeader
+ Document = TopDoc
+ Footer = TopFooter
+ if (GETARG["Method"] == "GET") {
+ HandleGET()
+ } else if (GETARG["Method"] == "HEAD") {
+ # not yet implemented
+ } else if (GETARG["Method"] != "") {
+ print "bad method", GETARG["Method"]
+ }
+ Prompt = Header Document Footer
+ print "HTTP/1.0", Status, Reason |& HttpService
+ print "Connection: Close" |& HttpService
+ print "Pragma: no-cache" |& HttpService
+ len = length(Prompt) + length(ORS)
+ print "Content-length:", len |& HttpService
+ print ORS Prompt |& HttpService
+ # ignore all the header lines
+ while ((HttpService |& getline) > 0)
+ continue
+ # stop talking to this client
+ close(HttpService)
+ # wait for new client request
+ HttpService |& getline
+ # do some logging
+ print systime(), strftime(), $0
+ CGI_setup($1, $2, $3)
+ }
+}
+
+function CGI_setup( method, uri, version, i)
+{
+ delete GETARG
+ delete MENU
+ delete PARAM
+ GETARG["Method"] = method
+ GETARG["URI"] = uri
+ GETARG["Version"] = version
+
+ i = index(uri, "?")
+ if (i > 0) { # is there a "?" indicating a CGI request?
+ split(substr(uri, 1, i-1), MENU, "[/:]")
+ split(substr(uri, i+1), PARAM, "&")
+ for (i in PARAM) {
+ PARAM[i] = _CGI_decode(PARAM[i])
+ j = index(PARAM[i], "=")
+ GETARG[substr(PARAM[i], 1, j-1)] = \
+ substr(PARAM[i], j+1)
+ }
+ } else { # there is no "?", no need for splitting PARAMs
+ split(uri, MENU, "[/:]")
+ }
+ for (i in MENU) # decode characters in path
+ if (i > 4) # but not those in host name
+ MENU[i] = _CGI_decode(MENU[i])
+}
+function _CGI_decode(str, hexdigs, i, pre, code1, code2,
+ val, result)
+{
+ hexdigs = "123456789abcdef"
+
+ i = index(str, "%")
+ if (i == 0) # no work to do
+ return str
+
+ do {
+ pre = substr(str, 1, i-1) # part before %xx
+ code1 = substr(str, i+1, 1) # first hex digit
+ code2 = substr(str, i+2, 1) # second hex digit
+ str = substr(str, i+3) # rest of string
+
+ code1 = tolower(code1)
+ code2 = tolower(code2)
+ val = index(hexdigs, code1) * 16 \
+ + index(hexdigs, code2)
+
+ result = result pre sprintf("%c", val)
+ i = index(str, "%")
+ } while (i != 0)
+ if (length(str) > 0)
+ result = result str
+ return result
+}
diff --git a/awklib/eg/network/eliza.awk b/awklib/eg/network/eliza.awk
new file mode 100644
index 00000000..2e022b41
--- /dev/null
+++ b/awklib/eg/network/eliza.awk
@@ -0,0 +1,270 @@
+function SetUpServer() {
+ SetUpEliza()
+ TopHeader = \
+ "<HTML><title>An HTTP-based System with GAWK</title>\
+ <HEAD><META HTTP-EQUIV=\"Content-Type\"\
+ CONTENT=\"text/html; charset=iso-8859-1\"></HEAD>\
+ <BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\"\
+ LINK=\"#0000ff\" VLINK=\"#0000ff\"\
+ ALINK=\"#0000ff\"> <A NAME=\"top\">"
+ TopDoc = "\
+ <h2>Please choose one of the following actions:</h2>\
+ <UL>\
+ <LI>\
+ <A HREF=" MyPrefix "/AboutServer>About this server</A>\
+ </LI><LI>\
+ <A HREF=" MyPrefix "/AboutELIZA>About Eliza</A></LI>\
+ <LI>\
+ <A HREF=" MyPrefix \
+ "/StartELIZA>Start talking to Eliza</A></LI></UL>"
+ TopFooter = "</BODY></HTML>"
+}
+function HandleGET() {
+ # A real HTTP server would treat some parts of the URI as a file name.
+ # We take parts of the URI as menu choices and go on accordingly.
+ if(MENU[2] == "AboutServer") {
+ Document = "This is not a CGI script.\
+ This is an httpd, an HTML file, and a CGI script all \
+ in one GAWK script. It needs no separate www-server, \
+ no installation, and no root privileges.\
+ <p>To run it, do this:</p><ul>\
+ <li> start this script with \"gawk -f httpserver.awk\",</li>\
+ <li> and on the same host let your www browser open location\
+ \"http://localhost:8080\"</li>\
+ </ul>\<p>\ Details of HTTP come from:</p><ul>\
+ <li>Hethmon: Illustrated Guide to HTTP</p>\
+ <li>RFC 2068</li></ul><p>JK 14.9.1997</p>"
+ } else if (MENU[2] == "AboutELIZA") {
+ Document = "This is an implementation of the famous ELIZA\
+ program by Joseph Weizenbaum. It is written in GAWK and\
+/bin/sh: expad: command not found
+ } else if (MENU[2] == "StartELIZA") {
+ gsub(/\+/, " ", GETARG["YouSay"])
+ # Here we also have to substitute coded special characters
+ Document = "<form method=GET>" \
+ "<h3>" ElizaSays(GETARG["YouSay"]) "</h3>\
+ <p><input type=text name=YouSay value=\"\" size=60>\
+ <br><input type=submit value=\"Tell her about it\"></p></form>"
+ }
+}
+function ElizaSays(YouSay) {
+ if (YouSay == "") {
+ cost = 0
+ answer = "HI, IM ELIZA, TELL ME YOUR PROBLEM"
+ } else {
+ q = toupper(YouSay)
+ gsub("'", "", q)
+ if(q == qold) {
+ answer = "PLEASE DONT REPEAT YOURSELF !"
+ } else {
+ if (index(q, "SHUT UP") > 0) {
+ answer = "WELL, PLEASE PAY YOUR BILL. ITS EXACTLY ... $"\
+ int(100*rand()+30+cost/100)
+ } else {
+ qold = q
+ w = "-" # no keyword recognized yet
+ for (i in k) { # search for keywords
+ if (index(q, i) > 0) {
+ w = i
+ break
+ }
+ }
+ if (w == "-") { # no keyword, take old subject
+ w = wold
+ subj = subjold
+ } else { # find subject
+ subj = substr(q, index(q, w) + length(w)+1)
+ wold = w
+ subjold = subj # remember keyword and subject
+ }
+ for (i in conj)
+ gsub(i, conj[i], q) # conjugation
+ # from all answers to this keyword, select one randomly
+ answer = r[indices[int(split(k[w], indices) * rand()) + 1]]
+ # insert subject into answer
+ gsub("_", subj, answer)
+ }
+ }
+ }
+ cost += length(answer) # for later payment : 1 cent per character
+ return answer
+}
+function SetUpEliza() {
+ srand()
+ wold = "-"
+ subjold = " "
+
+ # table for conjugation
+ conj[" ARE " ] = " AM "
+ conj["WERE " ] = "WAS "
+ conj[" YOU " ] = " I "
+ conj["YOUR " ] = "MY "
+ conj[" IVE " ] =\
+ conj[" I HAVE " ] = " YOU HAVE "
+ conj[" YOUVE " ] =\
+ conj[" YOU HAVE "] = " I HAVE "
+ conj[" IM " ] =\
+ conj[" I AM " ] = " YOU ARE "
+ conj[" YOURE " ] =\
+ conj[" YOU ARE " ] = " I AM "
+
+ # table of all answers
+ r[1] = "DONT YOU BELIEVE THAT I CAN _"
+ r[2] = "PERHAPS YOU WOULD LIKE TO BE ABLE TO _ ?"
+ r[3] = "YOU WANT ME TO BE ABLE TO _ ?"
+ r[4] = "PERHAPS YOU DONT WANT TO _ "
+ r[5] = "DO YOU WANT TO BE ABLE TO _ ?"
+ r[6] = "WHAT MAKES YOU THINK I AM _ ?"
+ r[7] = "DOES IT PLEASE YOU TO BELIEVE I AM _ ?"
+ r[8] = "PERHAPS YOU WOULD LIKE TO BE _ ?"
+ r[9] = "DO YOU SOMETIMES WISH YOU WERE _ ?"
+ r[10] = "DONT YOU REALLY _ ?"
+ r[11] = "WHY DONT YOU _ ?"
+ r[12] = "DO YOU WISH TO BE ABLE TO _ ?"
+ r[13] = "DOES THAT TROUBLE YOU ?"
+ r[14] = "TELL ME MORE ABOUT SUCH FEELINGS"
+ r[15] = "DO YOU OFTEN FEEL _ ?"
+ r[16] = "DO YOU ENJOY FEELING _ ?"
+ r[17] = "DO YOU REALLY BELIEVE I DONT _ ?"
+ r[18] = "PERHAPS IN GOOD TIME I WILL _ "
+ r[19] = "DO YOU WANT ME TO _ ?"
+ r[20] = "DO YOU THINK YOU SHOULD BE ABLE TO _ ?"
+ r[21] = "WHY CANT YOU _ ?"
+ r[22] = "WHY ARE YOU INTERESTED IN WHETHER OR NOT I AM _ ?"
+ r[23] = "WOULD YOU PREFER IF I WERE NOT _ ?"
+ r[24] = "PERHAPS IN YOUR FANTASIES I AM _ "
+ r[25] = "HOW DO YOU KNOW YOU CANT _ ?"
+ r[26] = "HAVE YOU TRIED ?"
+ r[27] = "PERHAPS YOU CAN NOW _ "
+ r[28] = "DID YOU COME TO ME BECAUSE YOU ARE _ ?"
+ r[29] = "HOW LONG HAVE YOU BEEN _ ?"
+ r[30] = "DO YOU BELIEVE ITS NORMAL TO BE _ ?"
+ r[31] = "DO YOU ENJOY BEING _ ?"
+ r[32] = "WE WERE DISCUSSING YOU -- NOT ME"
+ r[33] = "Oh, I _"
+ r[34] = "YOU'RE NOT REALLY TALKING ABOUT ME, ARE YOU ?"
+ r[35] = "WHAT WOULD IT MEAN TO YOU, IF YOU GOT _ ?"
+ r[36] = "WHY DO YOU WANT _ ?"
+ r[37] = "SUPPOSE YOU SOON GOT _"
+ r[38] = "WHAT IF YOU NEVER GOT _ ?"
+ r[39] = "I SOMETIMES ALSO WANT _"
+ r[40] = "WHY DO YOU ASK ?"
+ r[41] = "DOES THAT QUESTION INTEREST YOU ?"
+ r[42] = "WHAT ANSWER WOULD PLEASE YOU THE MOST ?"
+ r[43] = "WHAT DO YOU THINK ?"
+ r[44] = "ARE SUCH QUESTIONS IN YOUR MIND OFTEN ?"
+ r[45] = "WHAT IS IT THAT YOU REALLY WANT TO KNOW ?"
+ r[46] = "HAVE YOU ASKED ANYONE ELSE ?"
+ r[47] = "HAVE YOU ASKED SUCH QUESTIONS BEFORE ?"
+ r[48] = "WHAT ELSE COMES TO MIND WHEN YOU ASK THAT ?"
+ r[49] = "NAMES DON'T INTEREST ME"
+ r[50] = "I DONT CARE ABOUT NAMES -- PLEASE GO ON"
+ r[51] = "IS THAT THE REAL REASON ?"
+ r[52] = "DONT ANY OTHER REASONS COME TO MIND ?"
+ r[53] = "DOES THAT REASON EXPLAIN ANYTHING ELSE ?"
+ r[54] = "WHAT OTHER REASONS MIGHT THERE BE ?"
+ r[55] = "PLEASE DON'T APOLOGIZE !"
+ r[56] = "APOLOGIES ARE NOT NECESSARY"
+ r[57] = "WHAT FEELINGS DO YOU HAVE WHEN YOU APOLOGIZE ?"
+ r[58] = "DON'T BE SO DEFENSIVE"
+ r[59] = "WHAT DOES THAT DREAM SUGGEST TO YOU ?"
+ r[60] = "DO YOU DREAM OFTEN ?"
+ r[61] = "WHAT PERSONS APPEAR IN YOUR DREAMS ?"
+ r[62] = "ARE YOU DISTURBED BY YOUR DREAMS ?"
+ r[63] = "HOW DO YOU DO ... PLEASE STATE YOUR PROBLEM"
+ r[64] = "YOU DON'T SEEM QUITE CERTAIN"
+ r[65] = "WHY THE UNCERTAIN TONE ?"
+ r[66] = "CAN'T YOU BE MORE POSITIVE ?"
+ r[67] = "YOU AREN'T SURE ?"
+ r[68] = "DON'T YOU KNOW ?"
+ r[69] = "WHY NO _ ?"
+ r[70] = "DON'T SAY NO, IT'S ALWAYS SO NEGATIVE"
+ r[71] = "WHY NOT ?"
+ r[72] = "ARE YOU SURE ?"
+ r[73] = "WHY NO ?"
+ r[74] = "WHY ARE YOU CONCERNED ABOUT MY _ ?"
+ r[75] = "WHAT ABOUT YOUR OWN _ ?"
+ r[76] = "CAN'T YOU THINK ABOUT A SPECIFIC EXAMPLE ?"
+ r[77] = "WHEN ?"
+ r[78] = "WHAT ARE YOU THINKING OF ?"
+ r[79] = "REALLY, ALWAYS ?"
+ r[80] = "DO YOU REALLY THINK SO ?"
+ r[81] = "BUT YOU ARE NOT SURE YOU _ "
+ r[82] = "DO YOU DOUBT YOU _ ?"
+ r[83] = "IN WHAT WAY ?"
+ r[84] = "WHAT RESEMBLANCE DO YOU SEE ?"
+ r[85] = "WHAT DOES THE SIMILARITY SUGGEST TO YOU ?"
+ r[86] = "WHAT OTHER CONNECTION DO YOU SEE ?"
+ r[87] = "COULD THERE REALLY BE SOME CONNECTIONS ?"
+ r[88] = "HOW ?"
+ r[89] = "YOU SEEM QUITE POSITIVE"
+ r[90] = "ARE YOU SURE ?"
+ r[91] = "I SEE"
+ r[92] = "I UNDERSTAND"
+ r[93] = "WHY DO YOU BRING UP THE TOPIC OF FRIENDS ?"
+ r[94] = "DO YOUR FRIENDS WORRY YOU ?"
+ r[95] = "DO YOUR FRIENDS PICK ON YOU ?"
+ r[96] = "ARE YOU SURE YOU HAVE ANY FRIENDS ?"
+ r[97] = "DO YOU IMPOSE ON YOUR FRIENDS ?"
+ r[98] = "PERHAPS YOUR LOVE FOR FRIENDS WORRIES YOU"
+ r[99] = "DO COMPUTERS WORRY YOU ?"
+ r[100] = "ARE YOU TALKING ABOUT ME IN PARTICULAR ?"
+ r[101] = "ARE YOU FRIGHTENED BY MACHINES ?"
+ r[102] = "WHY DO YOU MENTION COMPUTERS ?"
+ r[103] = "WHAT DO YOU THINK MACHINES HAVE TO DO WITH YOUR PROBLEMS ?"
+ r[104] = "DON'T YOU THINK COMPUTERS CAN HELP PEOPLE ?"
+ r[105] = "WHAT IS IT ABOUT MACHINES THAT WORRIES YOU ?"
+ r[106] = "SAY, DO YOU HAVE ANY PSYCHOLOGICAL PROBLEMS ?"
+ r[107] = "WHAT DOES THAT SUGGEST TO YOU ?"
+ r[108] = "I SEE"
+ r[109] = "IM NOT SURE I UNDERSTAND YOU FULLY"
+ r[110] = "COME COME ELUCIDATE YOUR THOUGHTS"
+ r[111] = "CAN YOU ELABORATE ON THAT ?"
+ r[112] = "THAT IS QUITE INTERESTING"
+ r[113] = "WHY DO YOU HAVE PROBLEMS WITH MONEY ?"
+ r[114] = "DO YOU THINK MONEY IS EVERYTHING ?"
+ r[115] = "ARE YOU SURE THAT MONEY IS THE PROBLEM ?"
+ r[116] = "I THINK WE WANT TO TALK ABOUT YOU, NOT ABOUT ME"
+ r[117] = "WHAT'S ABOUT ME ?"
+ r[118] = "WHY DO YOU ALWAYS BRING UP MY NAME ?"
+ # table for looking up answers that
+ # fit to a certain keyword
+ k["CAN YOU"] = "1 2 3"
+ k["CAN I"] = "4 5"
+ k["YOU ARE"] =\
+ k["YOURE"] = "6 7 8 9"
+ k["I DONT"] = "10 11 12 13"
+ k["I FEEL"] = "14 15 16"
+ k["WHY DONT YOU"] = "17 18 19"
+ k["WHY CANT I"] = "20 21"
+ k["ARE YOU"] = "22 23 24"
+ k["I CANT"] = "25 26 27"
+ k["I AM"] =\
+ k["IM "] = "28 29 30 31"
+ k["YOU "] = "32 33 34"
+ k["I WANT"] = "35 36 37 38 39"
+ k["WHAT"] =\
+ k["HOW"] =\
+ k["WHO"] =\
+ k["WHERE"] =\
+ k["WHEN"] =\
+ k["WHY"] = "40 41 42 43 44 45 46 47 48"
+ k["NAME"] = "49 50"
+ k["CAUSE"] = "51 52 53 54"
+ k["SORRY"] = "55 56 57 58"
+ k["DREAM"] = "59 60 61 62"
+ k["HELLO"] =\
+ k["HI "] = "63"
+ k["MAYBE"] = "64 65 66 67 68"
+ k[" NO "] = "69 70 71 72 73"
+ k["YOUR"] = "74 75"
+ k["ALWAYS"] = "76 77 78 79"
+ k["THINK"] = "80 81 82"
+ k["LIKE"] = "83 84 85 86 87 88 89"
+ k["YES"] = "90 91 92"
+ k["FRIEND"] = "93 94 95 96 97 98"
+ k["COMPUTER"] = "99 100 101 102 103 104 105"
+ k["-"] = "106 107 108 109 110 111 112"
+ k["MONEY"] = "113 114 115"
+ k["ELIZA"] = "116 117 118"
+}
diff --git a/awklib/eg/network/fingerclient.awk b/awklib/eg/network/fingerclient.awk
new file mode 100644
index 00000000..bcc2c94c
--- /dev/null
+++ b/awklib/eg/network/fingerclient.awk
@@ -0,0 +1,7 @@
+BEGIN {
+ NetService = "/inet/tcp/0/localhost/finger"
+ print "var{name}" |& NetService
+ while ((NetService |& getline) > 0)
+ print $0
+ close(NetService)
+}
diff --git a/awklib/eg/network/geturl.awk b/awklib/eg/network/geturl.awk
new file mode 100644
index 00000000..53853e50
--- /dev/null
+++ b/awklib/eg/network/geturl.awk
@@ -0,0 +1,24 @@
+BEGIN {
+ if (ARGC != 2) {
+ print "GETURL - retrieve Web page via HTTP 1.0"
+ print "IN:\n the URL as a command-line parameter"
+ print "PARAM(S):\n -v Proxy=MyProxy"
+ print "OUT:\n the page content on stdout"
+ print " the page header on stderr"
+ print "JK 16.05.1997"
+ print "ADR 13.08.2000"
+ exit
+ }
+ URL = ARGV[1]; ARGV[1] = ""
+ if (Proxy == "") Proxy = "127.0.0.1"
+ if (ProxyPort == 0) ProxyPort = 80
+ if (Method == "") Method = "GET"
+ HttpService = "/inet/tcp/0/" Proxy "/" ProxyPort
+ ORS = RS = "\r\n\r\n"
+ print Method " " URL " HTTP/1.0" |& HttpService
+ HttpService |& getline Header
+ print Header > "/dev/stderr"
+ while ((HttpService |& getline) > 0)
+ printf "%s", $0
+ close(HttpService)
+}
diff --git a/awklib/eg/network/hello-serv.awk b/awklib/eg/network/hello-serv.awk
new file mode 100644
index 00000000..003ee088
--- /dev/null
+++ b/awklib/eg/network/hello-serv.awk
@@ -0,0 +1,14 @@
+BEGIN {
+ RS = ORS = "\r\n"
+ HttpService = "/inet/tcp/8080/0/0"
+ Hello = "<HTML><HEAD>" \
+ "<TITLE>A Famous Greeting</TITLE></HEAD>" \
+ "<BODY><H1>Hello, world</H1></BODY></HTML>"
+ Len = length(Hello) + length(ORS)
+ print "HTTP/1.0 200 OK" |& HttpService
+ print "Content-Length: " Len ORS |& HttpService
+ print Hello |& HttpService
+ while ((HttpService |& getline) > 0)
+ continue;
+ close(HttpService)
+}
diff --git a/awklib/eg/network/maze.awk b/awklib/eg/network/maze.awk
new file mode 100644
index 00000000..94888f8c
--- /dev/null
+++ b/awklib/eg/network/maze.awk
@@ -0,0 +1,73 @@
+function SetUpServer() {
+ TopHeader = "<HTML><title>Walk through a maze</title>"
+ TopDoc = "\
+ <h2>Please choose one of the following actions:</h2>\
+ <UL>\
+ <LI><A HREF=" MyPrefix "/AboutServer>About this server</A>\
+ <LI><A HREF=" MyPrefix "/VRMLtest>Watch a simple VRML scene</A>\
+ </UL>"
+ TopFooter = "</HTML>"
+ srand()
+}
+function HandleGET() {
+ if (MENU[2] == "AboutServer") {
+ Document = "If your browser has a VRML 2 plugin,\
+ this server shows you a simple VRML scene."
+ } else if (MENU[2] == "VRMLtest") {
+ XSIZE = YSIZE = 11 # initially, everything is wall
+ for (y = 0; y < YSIZE; y++)
+ for (x = 0; x < XSIZE; x++)
+ Maze[x, y] = "#"
+ delete Maze[0, 1] # entry is not wall
+ delete Maze[XSIZE-1, YSIZE-2] # exit is not wall
+ MakeMaze(1, 1)
+ Document = "\
+#VRML V2.0 utf8\n\
+Group {\n\
+ children [\n\
+ PointLight {\n\
+ ambientIntensity 0.2\n\
+ color 0.7 0.7 0.7\n\
+ location 0.0 8.0 10.0\n\
+ }\n\
+ DEF B1 Background {\n\
+ skyColor [0 0 0, 1.0 1.0 1.0 ]\n\
+ skyAngle 1.6\n\
+ groundColor [1 1 1, 0.8 0.8 0.8, 0.2 0.2 0.2 ]\n\
+ groundAngle [ 1.2 1.57 ]\n\
+ }\n\
+ DEF Wall Shape {\n\
+ geometry Box {size 1 1 1}\n\
+ appearance Appearance { material Material { diffuseColor 0 0 1 } }\n\
+ }\n\
+ DEF Entry Viewpoint {\n\
+ position 0.5 1.0 5.0\n\
+ orientation 0.0 0.0 -1.0 0.52\n\
+ }\n"
+ for (i in Maze) {
+ split(i, t, SUBSEP)
+ Document = Document " Transform { translation "
+ Document = Document t[1] " 0 -" t[2] " children USE Wall }\n"
+ }
+ Document = Document " ] # end of group for world\n}"
+ Reason = "OK" ORS "Content-type: model/vrml"
+ Header = Footer = ""
+ }
+}
+function MakeMaze(x, y) {
+ delete Maze[x, y] # here we are, we have no wall here
+ p = 0 # count unvisited fields in all directions
+ if (x-2 SUBSEP y in Maze) d[p++] = "-x"
+ if (x SUBSEP y-2 in Maze) d[p++] = "-y"
+ if (x+2 SUBSEP y in Maze) d[p++] = "+x"
+ if (x SUBSEP y+2 in Maze) d[p++] = "+y"
+ if (p>0) { # if there are univisited fields, go there
+ p = int(p*rand()) # choose one unvisited field at random
+ if (d[p] == "-x") { delete Maze[x - 1, y]; MakeMaze(x - 2, y)
+ } else if (d[p] == "-y") { delete Maze[x, y - 1]; MakeMaze(x, y - 2)
+ } else if (d[p] == "+x") { delete Maze[x + 1, y]; MakeMaze(x + 2, y)
+ } else if (d[p] == "+y") { delete Maze[x, y + 1]; MakeMaze(x, y + 2)
+ } # we are back from recursion
+ MakeMaze(x, y); # try again while there are unvisited fields
+ }
+}
diff --git a/awklib/eg/network/mobag.awk b/awklib/eg/network/mobag.awk
new file mode 100644
index 00000000..a8c55008
--- /dev/null
+++ b/awklib/eg/network/mobag.awk
@@ -0,0 +1,72 @@
+BEGIN {
+ if (ARGC != 2) {
+ print "MOBAG - a simple mobile agent"
+ print "CALL:\n gawk -f mobag.awk mobag.awk"
+ print "IN:\n the name of this script as a command-line parameter"
+ print "PARAM:\n -v MyOrigin=myhost.com"
+ print "OUT:\n the result on stdout"
+ print "JK 29.03.1998 01.04.1998"
+ exit
+ }
+ if (MyOrigin == "") {
+ "uname -n" | getline MyOrigin
+ close("uname -n")
+ }
+}
+#ReadMySelf
+/^function / { FUNC = $2 }
+/^END/ || /^#ReadMySelf/ { FUNC = $1 }
+FUNC != "" { MOBFUN[FUNC] = MOBFUN[FUNC] RS $0 }
+(FUNC != "") && (/^}/ || /^#EndOfMySelf/) \
+ { FUNC = "" }
+#EndOfMySelf
+function migrate(Destination, MobCode, Label) {
+ MOBVAR["Label"] = Label
+ MOBVAR["Destination"] = Destination
+ RS = ORS = "\r\n"
+ HttpService = "/inet/tcp/0/" Destination
+ for (i in MOBFUN)
+ MobCode = (MobCode "\n" MOBFUN[i])
+ MobCode = MobCode "\n\nBEGIN {"
+ for (i in MOBVAR)
+ MobCode = (MobCode "\n MOBVAR[\"" i "\"] = \"" MOBVAR[i] "\"")
+ MobCode = MobCode "\n}\n"
+ print "POST /cgi-bin/PostAgent.sh HTTP/1.0" |& HttpService
+ print "Content-length:", length(MobCode) ORS |& HttpService
+ printf "%s", MobCode |& HttpService
+ while ((HttpService |& getline) > 0)
+ print $0
+ close(HttpService)
+}
+END {
+ if (ARGC != 2) exit # stop when called with wrong parameters
+ if (MyOrigin != "") # is this the originating host?
+ MyInit() # if so, initialize the application
+ else # we are on a host with migrated data
+ MyJob() # so we do our job
+}
+function MyInit() {
+ MOBVAR["MyOrigin"] = MyOrigin
+ MOBVAR["Machines"] = "localhost/80 max/80 moritz/80 castor/80"
+ split(MOBVAR["Machines"], Machines) # which host is the first?
+ migrate(Machines[1], "", "") # go to the first host
+ while (("/inet/tcp/8080/0/0" |& getline) > 0) # wait for result
+ print $0 # print result
+ close("/inet/tcp/8080/0/0")
+}
+function MyJob() {
+ # forget this host
+ sub(MOBVAR["Destination"], "", MOBVAR["Machines"])
+ MOBVAR["Result"]=MOBVAR["Result"] SUBSEP SUBSEP MOBVAR["Destination"] ":"
+ while (("who" | getline) > 0) # who is logged in?
+ MOBVAR["Result"] = MOBVAR["Result"] SUBSEP $0
+ close("who")
+ if (index(MOBVAR["Machines"], "/") > 0) { # any more machines to visit?
+ split(MOBVAR["Machines"], Machines) # which host is next?
+ migrate(Machines[1], "", "") # go there
+ } else { # no more machines
+ gsub(SUBSEP, "\n", MOBVAR["Result"]) # send result to origin
+ print MOBVAR["Result"] |& "/inet/tcp/0/" MOBVAR["MyOrigin"] "/8080"
+ close("/inet/tcp/0/" MOBVAR["MyOrigin"] "/8080")
+ }
+}
diff --git a/awklib/eg/network/panic.awk b/awklib/eg/network/panic.awk
new file mode 100644
index 00000000..6db8c46d
--- /dev/null
+++ b/awklib/eg/network/panic.awk
@@ -0,0 +1,18 @@
+BEGIN {
+ RS = ORS = "\r\n"
+ if (MyPort == 0) MyPort = 8080
+ HttpService = "/inet/tcp/" MyPort "/0/0"
+ Hello = "<HTML><HEAD><TITLE>Out Of Service</TITLE>" \
+ "</HEAD><BODY><H1>" \
+ "This site is temporarily out of service." \
+ "</H1></BODY></HTML>"
+ Len = length(Hello) + length(ORS)
+ while ("awk" != "complex") {
+ print "HTTP/1.0 200 OK" |& HttpService
+ print "Content-Length: " Len ORS |& HttpService
+ print Hello |& HttpService
+ while ((HttpService |& getline) > 0)
+ continue;
+ close(HttpService)
+ }
+}
diff --git a/awklib/eg/network/protbase.awk b/awklib/eg/network/protbase.awk
new file mode 100644
index 00000000..16199e45
--- /dev/null
+++ b/awklib/eg/network/protbase.awk
@@ -0,0 +1,11 @@
+{ request = request "\n" $0 }
+
+END {
+ BLASTService = "/inet/tcp/0/www.ncbi.nlm.nih.gov/80"
+ printf "POST /cgi-bin/BLAST/nph-blast_report HTTP/1.0\n" |& BLASTService
+ printf "Content-Length: " length(request) "\n\n" |& BLASTService
+ printf request |& BLASTService
+ while ((BLASTService |& getline) > 0)
+ print $0
+ close(BLASTService)
+}
diff --git a/awklib/eg/network/protbase.request b/awklib/eg/network/protbase.request
new file mode 100644
index 00000000..4c5c3d2c
--- /dev/null
+++ b/awklib/eg/network/protbase.request
@@ -0,0 +1,7 @@
+PROGRAM blastn
+DATALIB month
+EXPECT 0.75
+BEGIN
+>GAWK310 the gawking gene GNU AWK
+tgcttggctgaggagccataggacgagagcttcctggtgaagtgtgtttcttgaaatcat
+caccaccatggacagcaaa
diff --git a/awklib/eg/network/protbase.result b/awklib/eg/network/protbase.result
new file mode 100644
index 00000000..a087af43
--- /dev/null
+++ b/awklib/eg/network/protbase.result
@@ -0,0 +1,9 @@
+Sequences producing significant alignments: (bits) Value
+
+gb|AC021182.14|AC021182 Homo sapiens chromosome 7 clone RP11-733... 38 0.20
+gb|AC021056.12|AC021056 Homo sapiens chromosome 3 clone RP11-115... 38 0.20
+emb|AL160278.10|AL160278 Homo sapiens chromosome 9 clone RP11-57... 38 0.20
+emb|AL391139.11|AL391139 Homo sapiens chromosome X clone RP11-35... 38 0.20
+emb|AL365192.6|AL365192 Homo sapiens chromosome 6 clone RP3-421H... 38 0.20
+emb|AL138812.9|AL138812 Homo sapiens chromosome 11 clone RP1-276... 38 0.20
+gb|AC073881.3|AC073881 Homo sapiens chromosome 15 clone CTD-2169... 38 0.20
diff --git a/awklib/eg/network/remconf.awk b/awklib/eg/network/remconf.awk
new file mode 100644
index 00000000..f4f21e1a
--- /dev/null
+++ b/awklib/eg/network/remconf.awk
@@ -0,0 +1,54 @@
+function SetUpServer() {
+ TopHeader = "<HTML><title>Remote Configuration</title>"
+ TopDoc = "<BODY>\
+ <h2>Please choose one of the following actions:</h2>\
+ <UL>\
+ <LI><A HREF=" MyPrefix "/AboutServer>About this server</A></LI>\
+ <LI><A HREF=" MyPrefix "/ReadConfig>Read Configuration</A></LI>\
+ <LI><A HREF=" MyPrefix "/CheckConfig>Check Configuration</A></LI>\
+ <LI><A HREF=" MyPrefix "/ChangeConfig>Change Configuration</A></LI>\
+ <LI><A HREF=" MyPrefix "/SaveConfig>Save Configuration</A></LI>\
+ </UL>"
+ TopFooter = "</BODY></HTML>"
+ if (ConfigFile == "") ConfigFile = "config.asc"
+}
+function HandleGET() {
+ if(MENU[2] == "AboutServer") {
+ Document = "This is a GUI for remote configuration of an\
+ embedded system. It is is implemented as one GAWK script."
+ } else if (MENU[2] == "ReadConfig") {
+ RS = "\n"
+ while ((getline < ConfigFile) > 0)
+ config[$1] = $2;
+ close(ConfigFile)
+ RS = "\r\n"
+ Document = "Configuration has been read."
+ } else if (MENU[2] == "CheckConfig") {
+ Document = "<TABLE BORDER=1 CELLPADDING=5>"
+ for (i in config)
+ Document = Document "<TR><TD>" i "</TD>" \
+ "<TD>" config[i] "</TD></TR>"
+ Document = Document "</TABLE>"
+ } else if (MENU[2] == "ChangeConfig") {
+ if ("Param" in GETARG) { # any parameter to set?
+ if (GETARG["Param"] in config) { # is parameter valid?
+ config[GETARG["Param"]] = GETARG["Value"]
+ Document = (GETARG["Param"] " = " GETARG["Value"] ".")
+ } else {
+ Document = "Parameter <b>" GETARG["Param"] "</b> is invalid."
+ }
+ } else {
+ Document = "<FORM method=GET><h4>Change one parameter</h4>\
+ <TABLE BORDER CELLPADDING=5>\
+ <TR><TD>Parameter</TD><TD>Value</TD></TR>\
+ <TR><TD><input type=text name=Param value=\"\" size=20></TD>\
+ <TD><input type=text name=Value value=\"\" size=40></TD>\
+ </TR></TABLE><input type=submit value=\"Set\"></FORM>"
+ }
+ } else if (MENU[2] == "SaveConfig") {
+ for (i in config)
+ printf("%s %s\n", i, config[i]) > ConfigFile
+ close(ConfigFile)
+ Document = "Configuration has been saved."
+ }
+}
diff --git a/awklib/eg/network/statist.awk b/awklib/eg/network/statist.awk
new file mode 100644
index 00000000..8a583940
--- /dev/null
+++ b/awklib/eg/network/statist.awk
@@ -0,0 +1,85 @@
+function SetUpServer() {
+ TopHeader = "<HTML><title>Statistics with GAWK</title>"
+ TopDoc = "<BODY>\
+ <h2>Please choose one of the following actions:</h2>\
+ <UL>\
+ <LI><A HREF=" MyPrefix "/AboutServer>About this server</A></LI>\
+ <LI><A HREF=" MyPrefix "/EnterParameters>Enter Parameters</A></LI>\
+ </UL>"
+ TopFooter = "</BODY></HTML>"
+ GnuPlot = "gnuplot 2>&1"
+ m1=m2=0; v1=v2=1; n1=n2=10
+}
+function HandleGET() {
+ if(MENU[2] == "AboutServer") {
+ Document = "This is a GUI for a statistical computation.\
+ It compares means and variances of two distributions.\
+ It is implemented as one GAWK script and uses GNUPLOT."
+ } else if (MENU[2] == "EnterParameters") {
+ Document = ""
+ if ("m1" in GETARG) { # are there parameters to compare?
+ Document = Document "<SCRIPT LANGUAGE=\"JavaScript\">\
+ setTimeout(\"window.open(\\\"" MyPrefix "/Image" systime()\
+ "\\\",\\\"dist\\\", \\\"status=no\\\");\", 1000); </SCRIPT>"
+ m1 = GETARG["m1"]; v1 = GETARG["v1"]; n1 = GETARG["n1"]
+ m2 = GETARG["m2"]; v2 = GETARG["v2"]; n2 = GETARG["n2"]
+ t = (m1-m2)/sqrt(v1/n1+v2/n2)
+ df = (v1/n1+v2/n2)*(v1/n1+v2/n2)/((v1/n1)*(v1/n1)/(n1-1) \
+ + (v2/n2)*(v2/n2) /(n2-1))
+ if (v1>v2) {
+ f = v1/v2
+ df1 = n1 - 1
+ df2 = n2 - 1
+ } else {
+ f = v2/v1
+ df1 = n2 - 1
+ df2 = n1 - 1
+ }
+ print "pt=ibeta(" df/2 ",0.5," df/(df+t*t) ")" |& GnuPlot
+ print "pF=2.0*ibeta(" df2/2 "," df1/2 "," \
+ df2/(df2+df1*f) ")" |& GnuPlot
+ print "print pt, pF" |& GnuPlot
+ RS="\n"; GnuPlot |& getline; RS="\r\n" # $1 is pt, $2 is pF
+ print "invsqrt2pi=1.0/sqrt(2.0*pi)" |& GnuPlot
+ print "nd(x)=invsqrt2pi/sd*exp(-0.5*((x-mu)/sd)**2)" |& GnuPlot
+ print "set term png small color" |& GnuPlot
+ #print "set term postscript color" |& GnuPlot
+ #print "set term gif medium size 320,240" |& GnuPlot
+ print "set yrange[-0.3:]" |& GnuPlot
+ print "set label 'p(m1=m2) =" $1 "' at 0,-0.1 left" |& GnuPlot
+ print "set label 'p(v1=v2) =" $2 "' at 0,-0.2 left" |& GnuPlot
+ print "plot mu=" m1 ",sd=" sqrt(v1) ", nd(x) title 'sample 1',\
+ mu=" m2 ",sd=" sqrt(v2) ", nd(x) title 'sample 2'" |& GnuPlot
+ print "quit" |& GnuPlot
+ GnuPlot |& getline Image
+ while ((GnuPlot |& getline) > 0)
+ Image = Image RS $0
+ close(GnuPlot)
+ }
+ Document = Document "\
+ <h3>Do these samples have the same Gaussian distribution?</h3>\
+ <FORM METHOD=GET> <TABLE BORDER CELLPADDING=5>\
+ <TR>\
+ <TD>1. Mean </TD>
+ <TD><input type=text name=m1 value=" m1 " size=8></TD>\
+ <TD>1. Variance</TD>
+ <TD><input type=text name=v1 value=" v1 " size=8></TD>\
+ <TD>1. Count </TD>
+ <TD><input type=text name=n1 value=" n1 " size=8></TD>\
+ </TR><TR>\
+ <TD>2. Mean </TD>
+ <TD><input type=text name=m2 value=" m2 " size=8></TD>\
+ <TD>2. Variance</TD>
+ <TD><input type=text name=v2 value=" v2 " size=8></TD>\
+ <TD>2. Count </TD>
+ <TD><input type=text name=n2 value=" n2 " size=8></TD>\
+ </TR> <input type=submit value=\"Compute\">\
+ </TABLE></FORM><BR>"
+ } else if (MENU[2] ~ "Image") {
+ Reason = "OK" ORS "Content-type: image/png"
+ #Reason = "OK" ORS "Content-type: application/x-postscript"
+ #Reason = "OK" ORS "Content-type: image/gif"
+ Header = Footer = ""
+ Document = Image
+ }
+}
diff --git a/awklib/eg/network/stoxdata.txt b/awklib/eg/network/stoxdata.txt
new file mode 100644
index 00000000..1b6d015e
--- /dev/null
+++ b/awklib/eg/network/stoxdata.txt
@@ -0,0 +1,4 @@
+Date,Open,High,Low,Close,Volume
+9-Oct-00,22.75,22.75,21.375,22.375,7888500
+6-Oct-00,23.8125,24.9375,21.5625,22,10701100
+5-Oct-00,24.4375,24.625,23.125,23.50,5810300
diff --git a/awklib/eg/network/stoxpred.awk b/awklib/eg/network/stoxpred.awk
new file mode 100644
index 00000000..5cdc2a8d
--- /dev/null
+++ b/awklib/eg/network/stoxpred.awk
@@ -0,0 +1,116 @@
+function ReadQuotes() {
+ # Retrieve historical data for each ticker symbol
+ FS = ","
+ for (stock = 1; stock <= StockCount; stock++) {
+ URL = "http://chart.yahoo.com/table.csv?s=" name[stock] \
+ "&a=" month "&b=" day "&c=" year-1 \
+ "&d=" month "&e=" day "&f=" year \
+ "g=d&q=q&y=0&z=" name[stock] "&x=.csv"
+ printf("GET " URL " HTTP/1.0\r\n\r\n") |& YahooData
+ while ((YahooData |& getline) > 0) {
+ if (NF == 6 && $1 ~ /Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/) {
+ if (stock == 1)
+ days[++daycount] = $1;
+ quote[$1, stock] = $5
+ }
+ }
+ close(YahooData)
+ }
+ FS = " "
+}
+function CleanUp() {
+ # clean up time series; eliminate incomplete data sets
+ for (d = 1; d <= daycount; d++) {
+ for (stock = 1; stock <= StockCount; stock++)
+ if (! ((days[d], stock) in quote))
+ stock = StockCount + 10
+ if (stock > StockCount + 1)
+ continue
+ datacount++
+ for (stock = 1; stock <= StockCount; stock++)
+ data[datacount, stock] = int(0.5 + quote[days[d], stock])
+ }
+ delete quote
+ delete days
+}
+function Prediction() {
+ # Predict each ticker symbol by prolonging yesterday's trend
+ for (stock = 1; stock <= StockCount; stock++) {
+ if (data[1, stock] > data[2, stock]) {
+ predict[stock] = "up"
+ } else if (data[1, stock] < data[2, stock]) {
+ predict[stock] = "down"
+ } else {
+ predict[stock] = "neutral"
+ }
+ if ((data[1, stock] > data[2, stock]) && (data[2, stock] > data[3, stock]))
+ hot[stock] = 1
+ if ((data[1, stock] < data[2, stock]) && (data[2, stock] < data[3, stock]))
+ avoid[stock] = 1
+ }
+ # Do a plausibility check: how many predictions proved correct?
+ for (s = 1; s <= StockCount; s++) {
+ for (d = 1; d <= datacount-2; d++) {
+ if (data[d+1, s] > data[d+2, s]) {
+ UpCount++
+ } else if (data[d+1, s] < data[d+2, s]) {
+ DownCount++
+ } else {
+ NeutralCount++
+ }
+ if (((data[d, s] > data[d+1, s]) && (data[d+1, s] > data[d+2, s])) ||
+ ((data[d, s] < data[d+1, s]) && (data[d+1, s] < data[d+2, s])) ||
+ ((data[d, s] == data[d+1, s]) && (data[d+1, s] == data[d+2, s])))
+ CorrectCount++
+ }
+ }
+}
+function Report() {
+ # Generate report
+ report = "\nThis is your daily "
+ report = report "stock market report for "strftime("%A, %B %d, %Y")".\n"
+ report = report "Here are the predictions for today:\n\n"
+ for (stock = 1; stock <= StockCount; stock++)
+ report = report "\t" name[stock] "\t" predict[stock] "\n"
+ for (stock in hot) {
+ if (HotCount++ == 0)
+ report = report "\nThe most promising shares for today are these:\n\n"
+ report = report "\t" name[stock] "\t\thttp://biz.yahoo.com/n/" \
+ tolower(substr(name[stock], 1, 1)) "/" tolower(name[stock]) ".html\n"
+ }
+ for (stock in avoid) {
+ if (AvoidCount++ == 0)
+ report = report "\nThe stock shares to avoid today are these:\n\n"
+ report = report "\t" name[stock] "\t\thttp://biz.yahoo.com/n/" \
+ tolower(substr(name[stock], 1, 1)) "/" tolower(name[stock]) ".html\n"
+ }
+ report = report "\nThis sums up to " HotCount+0 " winners and " AvoidCount+0
+ report = report " losers. When using this kind\nof prediction scheme for"
+ report = report " the 12 months which lie behind us,\nwe get " UpCount
+ report = report " 'ups' and " DownCount " 'downs' and " NeutralCount
+ report = report " 'neutrals'. Of all\nthese " UpCount+DownCount+NeutralCount
+ report = report " predictions " CorrectCount " proved correct next day.\n"
+ report = report "A success rate of "\
+ int(100*CorrectCount/(UpCount+DownCount+NeutralCount)) "%.\n"
+ report = report "Random choice would have produced a 33% success rate.\n"
+ report = report "Disclaimer: Like every other prediction of the stock\n"
+ report = report "market, this report is, of course, complete nonsense.\n"
+ report = report "If you are stupid enough to believe these predictions\n"
+ report = report "you should visit a doctor who can treat your ailment."
+}
+function SendMail() {
+ # send report to customers
+ customer["uncle.scrooge@ducktown.gov"] = "Uncle Scrooge"
+ customer["more@utopia.org" ] = "Sir Thomas More"
+ customer["spinoza@denhaag.nl" ] = "Baruch de Spinoza"
+ customer["marx@highgate.uk" ] = "Karl Marx"
+ customer["keynes@the.long.run" ] = "John Maynard Keynes"
+ customer["bierce@devil.hell.org" ] = "Ambrose Bierce"
+ customer["laplace@paris.fr" ] = "Pierre Simon de Laplace"
+ for (c in customer) {
+ MailPipe = "mail -s 'Daily Stock Prediction Newsletter'" c
+ print "Good morning " customer[c] "," | MailPipe
+ print report "\n.\n" | MailPipe
+ close(MailPipe)
+ }
+}
diff --git a/awklib/eg/network/testserv.awk b/awklib/eg/network/testserv.awk
new file mode 100644
index 00000000..812bfe6a
--- /dev/null
+++ b/awklib/eg/network/testserv.awk
@@ -0,0 +1,12 @@
+BEGIN {
+ CGI_setup("GET",
+ "http://www.gnu.org/cgi-bin/foo?p1=stuff&p2=stuff%26junk" \
+ "&percent=a %25 sign",
+ "1.0")
+ for (i in MENU)
+ printf "MENU[\"%s\"] = %s\n", i, MENU[i]
+ for (i in PARAM)
+ printf "PARAM[\"%s\"] = %s\n", i, PARAM[i]
+ for (i in GETARG)
+ printf "GETARG[\"%s\"] = %s\n", i, GETARG[i]
+}
diff --git a/awklib/eg/network/urlchk.awk b/awklib/eg/network/urlchk.awk
new file mode 100644
index 00000000..6ddedfa8
--- /dev/null
+++ b/awklib/eg/network/urlchk.awk
@@ -0,0 +1,28 @@
+BEGIN {
+ if (ARGC != 2) {
+ print "URLCHK - check if URLs have changed"
+ print "IN:\n the file with URLs as a command-line parameter"
+ print " file contains URL, old length, new length"
+ print "PARAMS:\n -v Proxy=MyProxy -v ProxyPort=8080"
+ print "OUT:\n same as file with URLs"
+ print "JK 02.03.1998"
+ exit
+ }
+ URLfile = ARGV[1]; ARGV[1] = ""
+ if (Proxy != "") Proxy = " -v Proxy=" Proxy
+ if (ProxyPort != "") ProxyPort = " -v ProxyPort=" ProxyPort
+ while ((getline < URLfile) > 0)
+ Length[$1] = $3 + 0
+ close(URLfile) # now, URLfile is read in and can be updated
+ GetHeader = "gawk " Proxy ProxyPort " -v Method=\"HEAD\" -f geturl.awk "
+ for (i in Length) {
+ GetThisHeader = GetHeader i " 2>&1"
+ while ((GetThisHeader | getline) > 0)
+ if (toupper($0) ~ /CONTENT-LENGTH/) NewLength = $2 + 0
+ close(GetThisHeader)
+ print i, Length[i], NewLength > URLfile
+ if (Length[i] != NewLength) # report only changed URLs
+ print i, Length[i], NewLength
+ }
+ close(URLfile)
+}
diff --git a/awklib/eg/network/webgrab.awk b/awklib/eg/network/webgrab.awk
new file mode 100644
index 00000000..41738805
--- /dev/null
+++ b/awklib/eg/network/webgrab.awk
@@ -0,0 +1,6 @@
+BEGIN { RS = "http://[#%&\\+\\-\\./0-9\\:;\\?A-Z_a-z\\~]*" }
+RT != "" {
+ command = ("gawk -v Proxy=MyProxy -f geturl.awk " RT \
+ " > doc" NR ".html")
+ print command
+}