summaryrefslogtreecommitdiff
path: root/usr.bin/learn/lib/editor/L44.1g
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/learn/lib/editor/L44.1g')
-rw-r--r--usr.bin/learn/lib/editor/L44.1g121
1 files changed, 121 insertions, 0 deletions
diff --git a/usr.bin/learn/lib/editor/L44.1g b/usr.bin/learn/lib/editor/L44.1g
new file mode 100644
index 00000000000..b0eb263675f
--- /dev/null
+++ b/usr.bin/learn/lib/editor/L44.1g
@@ -0,0 +1,121 @@
+#print
+Of course, you can also search for lines that
+contain backslashes; again, it's simply a matter
+of doubling the backslash in the search pattern.
+That is,
+ /\\/
+finds the next line with a backslash.
+
+Find the second occurrence of "\n\n" in the file
+"prog.c", and type "answer N", where N is its
+line number.
+#create prog.c
+
+int nsave = 0;
+
+selunit()
+{
+ char fnam[20], s[50];
+ static char dobuff[50];
+ char posslev[20][20];
+ int diff[20], i, k, m, n, best, alts, statb[20];
+ FILE *f;
+ char zb[200];
+ static char saved[20];
+
+ while (ask) {
+ printf("What lesson? ");
+ fflush(stdout);
+ gets(dobuff);
+ if (strcmp(dobuff, "bye") == 0)
+ wrapup(0);
+ level = todo = dobuff;
+ sprintf(s, "../L%s", dobuff);
+ if (access(s, 04) == 0)
+ return;
+ printf("no such lesson\n");
+ }
+ alts = 0;
+retry:
+ f=scrin;
+ if (f==NULL) {
+ sprintf(fnam, "../L%s", level);
+ f = fopen(fnam, "r");
+ if (f==NULL) {
+ fprintf(stderr, "No script for lesson %s.\n", level);
+ wrapup(1);
+ }
+ while (fgets(zb, 200, f)) {
+ trim(zb);
+ if (strcmp(zb, "#next")==0)
+ break;
+ }
+ }
+ if (feof(f)) {
+ printf("Congratulations\n\n.You have finished this sequence.\n");
+ fflush(stdout);
+ todo = 0;
+ return;
+ }
+ for(i=0; fgets(s, 50, f); i++) {
+ sscanf(s, "%s %d", &posslev[i], &diff[i]);
+ }
+ best = -1;
+ /* cycle through lessons from random start */
+ /* first try the current place, failing that back up to
+ last place there are untried alternatives (but only one backup) */
+ n = grand()%i;
+ for(k=0; k<i; k++) {
+ m = (n+k)%i;
+ if (already(posslev[m])) continue;
+ if (best<0) best=m;
+ /* real alternatives */
+ alts++;
+ if (abs(diff[m]-speed) < abs(diff[best]-speed))
+ best=m;
+ }
+ if (best < 0 && nsave) {
+ nsave--;
+ strcpy(level, saved);
+ goto retry;
+ }
+ if (best <0) {
+ /* lessons exhausted or missing */
+ printf("Sorry, there are no alternative lessons at this stage.\n");
+ printf("See someone for help.\n\n");
+ fflush(stdout);
+ todo = 0;
+ return;
+ }
+ strcpy (dobuff, posslev[best]);
+ if (alts>1) {
+ nsave=1;
+ strcpy (saved, level);
+ }
+ todo = dobuff;
+ fclose(f);
+}
+
+abs(x)
+{
+ return(x>=0? x: -x);
+}
+
+grand()
+{
+ static int garbage;
+ int a[2], b;
+
+ time(a);
+ b = a[1]+10*garbage++;
+ return(b&077777);
+}
+#copyin
+#user
+#uncopyin
+#match 73
+#bad 43
+The second______ one.
+#log
+#next
+44.1h 10