|
|
1.1 ! root 1: . \" Copyright 1984,1985,1986,1987,1988,1989,1990 AT&T Bell Laboratories ! 2: .TH CIN 1 ! 3: .CT 1 prog_c ! 4: .SH NAME ! 5: cin \- C interpreter ! 6: .SH SYNOPSIS ! 7: .B cin ! 8: [ ! 9: .I option ... ! 10: ] ! 11: [ ! 12: .I file ... ! 13: ] ! 14: [ ! 15: .B -- ! 16: .I arg ... ! 17: ] ! 18: .SH DESCRIPTION ! 19: .I Cin ! 20: interprets a C program comprising the ! 21: .I file ! 22: arguments as in ! 23: .IR cc (1). ! 24: The special name ! 25: .L - ! 26: signifies standard input. ! 27: When called with no ! 28: .I file ! 29: arguments, ! 30: .I cin ! 31: defaults to ! 32: .BR -i . ! 33: Arguments ! 34: .I arg ! 35: are passed to the interpreted program as ! 36: .BR cin_argv[1] , ! 37: .BR cin_argv[2] , ! 38: \&... ! 39: and ! 40: .BR cin_argc . ! 41: .PP ! 42: Options ! 43: .BI -D name = def , ! 44: .BI -D name , ! 45: .BI -L name , ! 46: .BI -U name , ! 47: .BI -I name , ! 48: .BI -l x , ! 49: .BI -o name , ! 50: and ! 51: .BI -u name ! 52: are as in ! 53: .IR cc . ! 54: Options ! 55: .B -O ! 56: and ! 57: .B -g ! 58: are ignored. ! 59: Other options are: ! 60: .TP ! 61: .BI -0 name ! 62: Pass ! 63: .I name ! 64: to the interpreted program as ! 65: .BR cin_argv[0] . ! 66: .TP ! 67: .BI -C name ! 68: Use ! 69: .I name ! 70: as the interpreter startup file ! 71: (by default, the file ! 72: .FR $HOME/.cin.c ). ! 73: The interpreter startup file is ignored by using ! 74: .BR -C/dev/null . ! 75: .TP ! 76: .BI -F i : o : e ! 77: Use file descriptors ! 78: .IR i , o , e ! 79: as standard input, standard output, and standard error for the ! 80: interpreter, as distinct from the interpreted code ! 81: (by default, 0, 1, and 2). ! 82: .TP ! 83: .B -S ! 84: Enable interactive mode after run-time errors. ! 85: .TP ! 86: .BI -V name : n ! 87: Declare function ! 88: .I name ! 89: to have a variable number of arguments, the first ! 90: .I n ! 91: of which are to be type-checked. ! 92: .TP ! 93: .B -c ! 94: Parse files but do not execute the program. ! 95: .TP ! 96: .B -i ! 97: Enable interactive interpretation. ! 98: C statements are evaluated immediately using local and global variables. ! 99: Non-void values are printed. ! 100: Function, variable, and C pre-processor declarations are stored ! 101: in the current `view'. ! 102: A function definition must include its return type. ! 103: Declarations and statements can appear in any order and ! 104: identifiers can be redeclared. ! 105: .TP ! 106: .B -r ! 107: Prohibit multiply-declared global variables. ! 108: .TP ! 109: .B -s ! 110: Do not catch signals using ! 111: .IR signal (2) ! 112: (by default, ! 113: .I cin ! 114: catches ! 115: .BR SIGBUS , ! 116: .BR SIGEMT , ! 117: .BR SIGFPE , ! 118: .BR SIGILL , ! 119: .BR SIGINT , ! 120: .BR SIGIOT , ! 121: .BR SIGSEGV , ! 122: .BR SIGSYS , ! 123: .BR SIGTRAP ). ! 124: .TP ! 125: .B -v ! 126: Print the user and system times associated with loading files and executing ! 127: the program, as in ! 128: .IR time (1). ! 129: .TP ! 130: .BI + option ! 131: Turn off the specified ! 132: .IR option . ! 133: .PP ! 134: The functions and variables listed below are predefined in ! 135: .I cin ! 136: and ! 137: .IR libcin.a . ! 138: Their arguments are typed according to these conventions: ! 139: .IP ! 140: .B char ! 141: .BI * func , ! 142: .BI * message , ! 143: .BI * mod , ! 144: .BI * name , ! 145: .BI * ref , ! 146: .BI * string ; ! 147: .br ! 148: .B enode ! 149: .BI * code ; ! 150: .br ! 151: .B int ! 152: .IB level , ! 153: .IB line ; ! 154: .br ! 155: .B long ! 156: .BI (* after )(); ! 157: .br ! 158: .B unsigned ! 159: .B long ! 160: .IB addr ; ! 161: .br ! 162: .B void ! 163: .BI (* before )(), ! 164: .BI (* routine )(); ! 165: .PP ! 166: This first group of functions and variables are the most commonly used. ! 167: To use them load ! 168: .F libcin.a ! 169: and include ! 170: .FR cin.h . ! 171: .PP ! 172: .HP ! 173: .BI "int cin_break(" name , ! 174: .IB line , ! 175: .IB string ) ! 176: .br ! 177: If ! 178: .I string ! 179: is ! 180: .BR "(char *)0" , ! 181: place a ! 182: .B cin_system ! 183: in file ! 184: .I name ! 185: before line number ! 186: .IR line . ! 187: Otherwise, ! 188: place the C-language statement specified by ! 189: .I string ! 190: in file ! 191: .I name ! 192: before line number ! 193: .IR line . ! 194: Thus, ! 195: .IR string ! 196: is read and evaluated ! 197: within the prevailing context of the function ! 198: without stopping execution. ! 199: Return 0 if line number ! 200: .I line ! 201: cannot be found in file ! 202: .IR name . ! 203: .TP ! 204: .BI "int cin_dump(" name ) ! 205: Create an ! 206: .F a.out ! 207: and place it in the file ! 208: .IR name . ! 209: Return 0 if ! 210: .I name ! 211: cannot be created. ! 212: .TP ! 213: .BI "void cin_info(" string ) ! 214: Where ! 215: .I string ! 216: is: ! 217: .RS ! 218: .TP ! 219: .B breakpoint ! 220: Print ! 221: .IR cin 's ! 222: .BR cin_break s ! 223: and ! 224: .BR cin_stopin s. ! 225: .TP ! 226: .B log ! 227: Print ! 228: .IR cin 's ! 229: interactive mode log file name. ! 230: .TP ! 231: .B memory ! 232: Print ! 233: .IR cin 's ! 234: memory usage. ! 235: .TP ! 236: .B spy ! 237: Print ! 238: .IR cin 's ! 239: spies. ! 240: .TP ! 241: .B symboltable ! 242: Print ! 243: .IR cin 's ! 244: symbol table. ! 245: .TP ! 246: .B undefined ! 247: Print ! 248: .IR cin 's ! 249: undefined variables. ! 250: .TP ! 251: .B usage ! 252: Print ! 253: .IR cin 's ! 254: usage message. ! 255: .TP ! 256: .B version ! 257: Print ! 258: .IR cin 's ! 259: version number. ! 260: .TP ! 261: .B view ! 262: List the available views. ! 263: The current view is starred ! 264: .RB ( * ). ! 265: .TP ! 266: .B where ! 267: Print a trace of function calls. ! 268: .TP ! 269: .B wrapper ! 270: Print ! 271: .IR cin 's ! 272: wrappers. ! 273: .RE ! 274: .TP ! 275: .BI "int cin_load(" string ) ! 276: Evaluate ! 277: .I string ! 278: as invocation arguments of ! 279: .IR cin . ! 280: Return 0 if arguments are not valid. ! 281: .TP ! 282: .BI "int cin_log(" name ) ! 283: .IR mv (1) ! 284: the interactive mode session log to file ! 285: .IR name . ! 286: Return 0 if ! 287: .I name ! 288: cannot be ! 289: .IR mv ed. ! 290: .TP ! 291: .BI "void cin_make(" string ) ! 292: If ! 293: .I string ! 294: is ! 295: .BR "(char *)0" , ! 296: then re-load any file that is out of date. ! 297: Otherwise, ! 298: run ! 299: .BR $MAKE , ! 300: passing ! 301: .I string ! 302: as arguments, and scan ! 303: its standard output for lines that begin with pound sign ! 304: .RB ( # ). ! 305: Characters following the pound sign are executed as ! 306: a C-language statement. ! 307: .HP ! 308: .BI "int cin_pp(" func , ! 309: .IB level ) ! 310: .br ! 311: Print the C-language for the function ! 312: .IR func . ! 313: Where ! 314: .I level ! 315: is: ! 316: .RS ! 317: .TP ! 318: .B 0 ! 319: Print declaration. ! 320: .TP ! 321: .B 1 ! 322: Print declaration and body. ! 323: .PP ! 324: Return 0 if ! 325: .I func ! 326: cannot be found. ! 327: .RE ! 328: .TP ! 329: .B "void cin_quit()" ! 330: Flush output and exit ! 331: .IR cin . ! 332: If all else fails, ! 333: use ! 334: .IR _exit(2) . ! 335: .TP ! 336: .B "int cin_reset()" ! 337: Preserve function definitions, ! 338: zero bss variables, ! 339: and restore initialized data variables to their original values. ! 340: Return 0 if ! 341: state cannot be reset. ! 342: .TP ! 343: .B "void cin_return()" ! 344: Return from a call to ! 345: .BR cin_system . ! 346: .TP ! 347: .BI "void cin_run(" string ) ! 348: Set ! 349: .BR cin_argv[1] , ! 350: .BR cin_argv[2] , ! 351: \&... ! 352: and ! 353: .B cin_argc ! 354: from ! 355: .I string ! 356: and then ! 357: .BR "main(cin_argc, cin_argv)" . ! 358: .HP ! 359: .BI "int cin_spy(" func , ! 360: .IB name , ! 361: .IB mod , ! 362: .IB ref ) ! 363: .br ! 364: Trace variable references and modifications. ! 365: If ! 366: .I mod ! 367: is not ! 368: .BR "(char *)0" , ! 369: place the C-language statement specified by ! 370: .I mod ! 371: after the variable ! 372: .I name ! 373: is modified in the function ! 374: .IR func . ! 375: If ! 376: .I ref ! 377: is not ! 378: .BR "(char *)0" , ! 379: place the C-language statement specified by ! 380: .I ref ! 381: before the variable ! 382: .I name ! 383: is referenced in the function ! 384: .IR func . ! 385: If function value ! 386: .I func ! 387: is ! 388: .BR "(char *)0" , ! 389: search all functions. ! 390: Return 0 if ! 391: .I name ! 392: cannot be found in ! 393: .IR func . ! 394: .TP ! 395: .B "void cin_step()" ! 396: Step over function calls ! 397: to the next C-language statement in the current or previous function. ! 398: .TP ! 399: .B "void cin_stepin()" ! 400: Step into any function to the next C-language statement. ! 401: .TP ! 402: .B "void cin_stepout()" ! 403: Step out of the current function back to the next C-language statement ! 404: in the previous function. ! 405: .HP ! 406: .BI "int cin_stopin(" func , ! 407: .IB string ) ! 408: .br ! 409: If ! 410: .I string ! 411: is ! 412: .BR "(char *)0" , ! 413: place a ! 414: .B cin_system ! 415: before the first ! 416: executable line in the function ! 417: .IR func , ! 418: either in the current view or wherever ! 419: .I func ! 420: can be found. ! 421: Otherwise, ! 422: place the C-language statement specified by ! 423: .I string ! 424: before the first ! 425: executable line in the function ! 426: .IR func , ! 427: either in the current view or wherever it can be found. ! 428: Thus, ! 429: .IR string ! 430: is read and evaluated ! 431: within the prevailing context of the function ! 432: without stopping execution. ! 433: Return 0 if function ! 434: .I func ! 435: cannot be found. ! 436: .TP ! 437: .BI "char *cin_sync(" string ) ! 438: Where ! 439: .I string ! 440: is: ! 441: .RS ! 442: .TP ! 443: .B filename ! 444: Return the non-interactive C source file name being executed. ! 445: .TP ! 446: .B lineno ! 447: Return the non-interactive C source line number being executed. ! 448: .RE ! 449: .TP ! 450: .B "void cin_system()" ! 451: Start a ! 452: .BR cin_read - cin_eval - cin_print ! 453: loop. ! 454: .HP ! 455: .BI "int cin_unbreak(" name , ! 456: .IB line , ! 457: .IB string ) ! 458: .br ! 459: Clear a ! 460: .B cin_break ! 461: or a ! 462: .B cin_stopin ! 463: in file ! 464: .I name ! 465: before line number ! 466: .I line ! 467: with string ! 468: .IR string . ! 469: Return 0 if ! 470: .B cin_break ! 471: or ! 472: .B cin_stopin ! 473: cannot be cleared. ! 474: .TP ! 475: .BI "int cin_unload(" name ) ! 476: Unload the object file ! 477: .IR name . ! 478: Return 0 if ! 479: .I name ! 480: cannot be unloaded. ! 481: .HP ! 482: .BI "int cin_unspy(" func , ! 483: .IB name , ! 484: .IB mod , ! 485: .IB ref ) ! 486: .br ! 487: Remove the C-language statement specified by ! 488: .I mod ! 489: after the variable ! 490: .I name ! 491: is modified, ! 492: and the C-language statement specified by ! 493: .I ref ! 494: before the variable ! 495: .I name ! 496: is referenced in the function ! 497: .IR func . ! 498: Return 0 if spy cannot be cleared. ! 499: .HP ! 500: .BI "int cin_unstopin(" func , ! 501: .IB string ) ! 502: .br ! 503: Clear a ! 504: .B cin_stopin ! 505: or ! 506: .B cin_break ! 507: at the first ! 508: executable line in the function ! 509: .I func ! 510: with string ! 511: .I string ! 512: in either the current view or wherever ! 513: .I func ! 514: can be found. ! 515: Return 0 if the ! 516: .B cin_stopin ! 517: or ! 518: .B cin_break ! 519: cannot be cleared. ! 520: .HP ! 521: .BI "int cin_unwrapper(" func , ! 522: .IB before , ! 523: .IB after ) ! 524: .br ! 525: Remove the call of function ! 526: .I before ! 527: before the function ! 528: .I func ! 529: is called. ! 530: Remove the call of function ! 531: .I after ! 532: after the function ! 533: .I func ! 534: is called. ! 535: Return 0 if ! 536: .I func ! 537: cannot be found. ! 538: .TP ! 539: .BI "int cin_view(" name ) ! 540: Change the current view to ! 541: .IR name . ! 542: Return 0 if the view cannot be found. ! 543: .HP ! 544: .BI "int cin_wrapper(" func , ! 545: .IB before , ! 546: .IB after ) ! 547: .br ! 548: If ! 549: .I before ! 550: is not ! 551: .BR "(void (*)())0" , ! 552: call the function ! 553: .I before ! 554: with the arguments of function ! 555: .I func ! 556: before the function ! 557: .I func ! 558: is called. ! 559: If ! 560: .I after ! 561: is not ! 562: .BR "(long (*)())0" , ! 563: call the function ! 564: .I after ! 565: with the argument of the return value of function ! 566: .I func ! 567: after the function ! 568: .I func ! 569: is called. ! 570: The return value of function ! 571: .I after ! 572: is substituted for the return value of function ! 573: .IR func . ! 574: Return 0 if ! 575: .I name ! 576: cannot be found either in the current view or any other view. ! 577: .TP ! 578: .B "extern int cin_argc" ! 579: The number of elements passed to the interpreted program. ! 580: .TP ! 581: .B "extern char **cin_argv" ! 582: An array of the arguments passed to the interpreted program. ! 583: .TP ! 584: .B "extern char *cin_filename" ! 585: The current C source file name being executed. ! 586: .TP ! 587: .B "extern int cin_level" ! 588: The number of nested calls to ! 589: .BR cin_system . ! 590: .TP ! 591: .B "extern char *cin_libpath" ! 592: A colon ! 593: .RB ( : ) ! 594: -separated list of libraries to search for undefined routines ! 595: (by default, ! 596: the libraries specified on the command line and ! 597: .FR -lc ). ! 598: .TP ! 599: .B "extern int cin_lineno" ! 600: The current C source line number being executed. ! 601: .TP ! 602: .B "extern char *cin_prompt" ! 603: The interactive mode prompt (by default, ! 604: the string ! 605: .RB `` cin> " '')." ! 606: .PP ! 607: These are some of the less frequently used functions and variables in ! 608: .IR cin . ! 609: They are primarily used by ! 610: .I cin ! 611: library or language developers. ! 612: .TP ! 613: .BI "enode *cin_compile(" code ) ! 614: Analyze ! 615: .I code ! 616: and return an optimized program. ! 617: Return ! 618: .B "(enode *)0" ! 619: if ! 620: .I code ! 621: cannot be compiled. ! 622: .TP ! 623: .BI "int cin_epp(" func ) ! 624: Print the ! 625: .BR enode s ! 626: for function ! 627: .IR func . ! 628: Return 0 if ! 629: .I func ! 630: cannot be found. ! 631: .TP ! 632: .BI "enode *cin_eprint(" code ) ! 633: Print the ! 634: .I code ! 635: as ! 636: .BR enode s. ! 637: Return the argument. ! 638: .HP ! 639: .BI "char *cin_error_code_set(" message , ! 640: .IB string ) ! 641: .br ! 642: Where ! 643: .I message ! 644: is: ! 645: .RS ! 646: .TP ! 647: .B dynamic error ! 648: When ! 649: .I cin ! 650: detects ! 651: a divide by zero, ! 652: a modulus by zero, ! 653: a null pointer access, ! 654: or ! 655: an abnormal signal ! 656: execute the C-language statement specified by ! 657: .IR string . ! 658: .TP ! 659: .B undefined function ! 660: When ! 661: .I cin ! 662: detects an undefined function execute the C-language statement specified by ! 663: .IR string . ! 664: .TP ! 665: .B undefined symbol ! 666: When ! 667: .I cin ! 668: detects ! 669: an undefined symbol execute the C-language statement specified by ! 670: .IR string . ! 671: .PP ! 672: If ! 673: .I string ! 674: is ! 675: .BR "(char *)0" , ! 676: execute ! 677: .BR cin_system() . ! 678: Return the old ! 679: .I string ! 680: for ! 681: .IR message . ! 682: .RE ! 683: .TP ! 684: .BI "enode *cin_eval(" code ) ! 685: Execute the ! 686: .I code ! 687: as if it were present in the program where ! 688: .B cin_eval ! 689: is called. ! 690: Return the resulting program. ! 691: .TP ! 692: .BI "ident *cin_find_ident(" name ) ! 693: If ! 694: .I name ! 695: is not ! 696: .BR "(char *)0" , ! 697: return the identifier for the variable ! 698: .I name ! 699: either in the current view or wherever ! 700: .I name ! 701: can be found. ! 702: If ! 703: .I name ! 704: is ! 705: .BR "(char *)0" , ! 706: return the identifier for the previous non- ! 707: .B "(char *)0" ! 708: value of the variable ! 709: .I name ! 710: in the next view where ! 711: .I name ! 712: can be found. ! 713: Return ! 714: .B "(ident *)0" ! 715: if ! 716: .I name ! 717: cannot be found. ! 718: .TP ! 719: .BI "struct nlist *cin_find_nlist(" addr ) ! 720: Return the loader symbol table entry for the external address ! 721: .IR addr . ! 722: Return ! 723: .B "(struct nlist *)0" ! 724: if ! 725: .I addr ! 726: cannot be found. ! 727: .HP ! 728: .BI "void (*cin_info_set())(" string , ! 729: .IB routine ) ! 730: .br ! 731: Inform ! 732: .B cin_info ! 733: that it should call ! 734: .I routine ! 735: when it is passed ! 736: .IR string . ! 737: Return the old ! 738: .I routine ! 739: for ! 740: .IR string . ! 741: .TP ! 742: .BI "char *cin_ltof(" line ) ! 743: Return the function name at line number ! 744: .I line ! 745: in the current view. ! 746: Return ! 747: .B "(char *)0" ! 748: if a function cannot be found for ! 749: .IR line . ! 750: .TP ! 751: .BI "void cin_pop(" level ) ! 752: Replace ! 753: .I level ! 754: interpreted function calls from the stack with ! 755: .BR cin_system . ! 756: .HP ! 757: .BI "enode *cin_print(" code , ! 758: .IB level ) ! 759: .br ! 760: Print the ! 761: .I code ! 762: as C-language code. ! 763: Where ! 764: .I level ! 765: is: ! 766: .RS ! 767: .TP ! 768: .B 0 ! 769: Print declaration. ! 770: .TP ! 771: .B 1 ! 772: Print declaration and body. ! 773: .PP ! 774: Return the ! 775: .I code ! 776: argument. ! 777: .RE ! 778: .TP ! 779: .BI "enode *cin_read(" string ) ! 780: Read ! 781: .I string ! 782: and return a program. ! 783: Return ! 784: .B "(enode *)0" ! 785: if ! 786: .I string ! 787: cannot be parsed. ! 788: .TP ! 789: .BI "char *cin_slashify(" string ) ! 790: Return a pointer to storage obtained from ! 791: .IR malloc (3) ! 792: and there create a character array from ! 793: .I string ! 794: by translating ! 795: backspace, ! 796: form feed, ! 797: newline, ! 798: carriage return, ! 799: horizontal tab, ! 800: vertical tab, ! 801: backslash, ! 802: single quote, ! 803: and double quote ! 804: into ! 805: .BR \eb , ! 806: .BR \ef , ! 807: .BR \en , ! 808: .BR \er , ! 809: .BR \et , ! 810: .BR \ev , ! 811: .BR \e\e , ! 812: .BR \e' , ! 813: and ! 814: .B \e" ! 815: respectively. ! 816: Other non-printable characters are translated into ! 817: .BI \e ddd ! 818: octal notation. ! 819: .TP ! 820: .B "extern int cin_err_fd" ! 821: .IR Cin 's ! 822: standard error file descriptor. ! 823: .TP ! 824: .B "extern int cin_in_fd" ! 825: .IR Cin 's ! 826: standard input file descriptor. ! 827: .TP ! 828: .B "extern int cin_out_fd" ! 829: .IR Cin 's ! 830: standard output file descriptor. ! 831: .TP ! 832: .B "extern stackelem *cin_stack" ! 833: The trace of function calls. ! 834: .TP ! 835: .B "extern view *cin_views" ! 836: The list of available views. ! 837: .SH EXAMPLES ! 838: .TP ! 839: The world's shortest ``Hello world'' program. ! 840: .EX ! 841: cin> printf("Hello world\en"); ! 842: Hello world ! 843: (int)12 ! 844: .EE ! 845: .TP ! 846: Setting breakpoints and tracing function calls. ! 847: .EX ! 848: $ cin -lcin ! 849: cin> int f(x) { return x <= 1 ? 1 : x * f(x - 1); } ! 850: extern int f(); ! 851: cin> cin_stopin("f", (char*)0); ! 852: /tmp/cin006795: 1: f: set breakpoint: (char *)0 ! 853: (int)1 ! 854: cin> f(2); ! 855: /tmp/int006795: 1: f: stopped execution: ! 856: cin> cin_return(); ! 857: /tmp/int006795: 1: f: stopped execution: ! 858: cin> (void)cin_info("where"); ! 859: /tmp/cin006795: 5: cin_system: info: where: () ! 860: /tmp/cin006795: 1: f: info: where: (x = (int)1) ! 861: /tmp/cin006795: 1: f: info: where: (x = (int)2) ! 862: /tmp/cin006795: 3: cin_system: info: where: () ! 863: cin> x; ! 864: (int)1 ! 865: cin> cin_return(); ! 866: (int)2 ! 867: cin> cin_quit(); ! 868: $ ! 869: .EE ! 870: .SH FILES ! 871: .TF /usr/include/cin.h ! 872: .TP ! 873: .F /tmp/cin* ! 874: default interactive log ! 875: .TP ! 876: .F /usr/include/cin.h ! 877: various function and variable declarations ! 878: .TP ! 879: .F /usr/lib/libcin.a ! 880: various predefined functions ! 881: .TP ! 882: .F $HOME/.cin.c ! 883: interpreter startup file ! 884: .HP ! 885: other files as in ! 886: .IR cc (1) ! 887: .SH "SEE ALSO" ! 888: .I "Cin User Manual" ! 889: .br ! 890: .I "Cin Reference Manual" ! 891: .br ! 892: B. W. Kernighan and D. M. Ritchie, ! 893: .IR "The C Programming Language" , ! 894: Prentice-Hall, ! 895: 1978 ! 896: .br ! 897: .IR lint (1), ! 898: .IR ar (1), ! 899: .IR cc (1) ! 900: .SH BUGS ! 901: The addresses of ! 902: .IR etext , ! 903: .IR edata , ! 904: and ! 905: .I end ! 906: are not meaningful with incrementally loaded code.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.