home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / alt / sources / 2875 < prev    next >
Encoding:
Text File  |  1992-12-23  |  14.2 KB  |  566 lines

  1. Newsgroups: alt.sources
  2. Path: sparky!uunet!spool.mu.edu!news.cs.indiana.edu!umn.edu!csus.edu!netcom.com!thinman
  3. From: thinman@netcom.com (Technically Sweet)
  4. Subject: COOL: C Object-Oriented Library: part 4 of 4
  5. Message-ID: <1992Dec23.191619.10631@netcom.com>
  6. Organization: International Foundation for Internal Freedom
  7. Date: Wed, 23 Dec 1992 19:16:19 GMT
  8. Lines: 556
  9.  
  10. #!/bin/sh
  11. # This is part 04 of a multipart archive
  12. # ============= benchall ==============
  13. if test -f 'benchall' -a X"$1" != X"-c"; then
  14.     echo 'x - skipping benchall (File already exists)'
  15. else
  16. echo 'x - extracting benchall (Text)'
  17. sed 's/^X//' << 'SHAR_EOF' > 'benchall' &&
  18. X# Compile COOL benchmark and run.
  19. X# with & without GCC, optimization
  20. X
  21. X# Copyright 1991 by Lance Norskog
  22. X
  23. XBENCHFILES="bench.c timer.c class.c exception.c lookup.c msg.c util.c"
  24. X
  25. XSYS="-DUSG -Di386"
  26. X
  27. Xset -x
  28. Xc() {
  29. X    rm -f bench
  30. X    $* $SYS $BENCHFILES -o bench
  31. X    echo "CC=$*"
  32. X    bench
  33. X    echo
  34. X}
  35. Xc cc
  36. Xc cc -O
  37. Xc gcc -fwritable-strings
  38. Xc gcc -fwritable-strings -O
  39. SHAR_EOF
  40. chmod 0644 benchall ||
  41. echo 'restore of benchall failed'
  42. Wc_c="`wc -c < 'benchall'`"
  43. test 348 -eq "$Wc_c" ||
  44.     echo 'benchall: original size 348, current size' "$Wc_c"
  45. fi
  46. # ============= out.unix386 ==============
  47. if test -f 'out.unix386' -a X"$1" != X"-c"; then
  48.     echo 'x - skipping out.unix386 (File already exists)'
  49. else
  50. echo 'x - extracting out.unix386 (Text)'
  51. sed 's/^X//' << 'SHAR_EOF' > 'out.unix386' &&
  52. Xbench.c:
  53. Xtimer.c:
  54. Xclass.c:
  55. Xexception.c:
  56. Xlookup.c:
  57. Xmsg.c:
  58. Xutil.c:
  59. XCC=cc
  60. XObject:    34.05
  61. XCoolt:    14.97
  62. XTable:    6.57
  63. XCase:    8.78
  64. XCall:    5.65
  65. XCode:    1.84
  66. XObject: 3.9  Cool 1.7  Table 0.75  Case  1  Call 0.64  Code 0.21
  67. X
  68. Xbench.c:
  69. Xtimer.c:
  70. Xclass.c:
  71. Xexception.c:
  72. Xlookup.c:
  73. Xmsg.c:
  74. Xutil.c:
  75. XCC=cc -O
  76. XObject:    30.59
  77. XCoolt:    13.65
  78. XTable:    5.65
  79. XCase:    4.01
  80. XCall:    2.14
  81. XCode:    1.38
  82. XObject: 7.6  Cool 3.4  Table 1.4  Case  1  Call 0.53  Code 0.34
  83. X
  84. XCC=gcc -fwritable-strings
  85. XObject:    27.5
  86. XCoolt:    10.85
  87. XTable:    5.81
  88. XCase:    7.3
  89. XCall:    4.74
  90. XCode:    1.99
  91. XObject: 3.8  Cool 1.5  Table 0.8  Case  1  Call 0.65  Code 0.27
  92. X
  93. XCC=gcc -fwritable-strings -O
  94. XObject:    23.56
  95. XCoolt:    7.65
  96. XTable:    5.65
  97. XCase:    4.89
  98. XCall:    4.38
  99. XCode:    1.36
  100. XObject: 4.8  Cool 1.6  Table 1.2  Case  1  Call 0.9  Code 0.28
  101. X
  102. SHAR_EOF
  103. chmod 0644 out.unix386 ||
  104. echo 'restore of out.unix386 failed'
  105. Wc_c="`wc -c < 'out.unix386'`"
  106. test 745 -eq "$Wc_c" ||
  107.     echo 'out.unix386: original size 745, current size' "$Wc_c"
  108. fi
  109. # ============= tstall.com ==============
  110. if test -f 'tstall.com' -a X"$1" != X"-c"; then
  111.     echo 'x - skipping tstall.com (File already exists)'
  112. else
  113. echo 'x - extracting tstall.com (Text)'
  114. sed 's/^X//' << 'SHAR_EOF' > 'tstall.com' &&
  115. X$ set noon
  116. X$ run tst1
  117. X$ run tst2
  118. X$ run tst3
  119. X$ run tst4
  120. X$ run tst5
  121. X$ run tst6
  122. X$ exit
  123. SHAR_EOF
  124. chmod 0644 tstall.com ||
  125. echo 'restore of tstall.com failed'
  126. Wc_c="`wc -c < 'tstall.com'`"
  127. test 84 -eq "$Wc_c" ||
  128.     echo 'tstall.com: original size 84, current size' "$Wc_c"
  129. fi
  130. # ============= patchlevel.h ==============
  131. if test -f 'patchlevel.h' -a X"$1" != X"-c"; then
  132.     echo 'x - skipping patchlevel.h (File already exists)'
  133. else
  134. echo 'x - extracting patchlevel.h (Text)'
  135. sed 's/^X//' << 'SHAR_EOF' > 'patchlevel.h' &&
  136. X#define    PATCHLEVEL    3
  137. X
  138. SHAR_EOF
  139. chmod 0644 patchlevel.h ||
  140. echo 'restore of patchlevel.h failed'
  141. Wc_c="`wc -c < 'patchlevel.h'`"
  142. test 22 -eq "$Wc_c" ||
  143.     echo 'patchlevel.h: original size 22, current size' "$Wc_c"
  144. fi
  145. # ============= cool_elk.c ==============
  146. if test -f 'cool_elk.c' -a X"$1" != X"-c"; then
  147.     echo 'x - skipping cool_elk.c (File already exists)'
  148. else
  149. echo 'x - extracting cool_elk.c (Text)'
  150. sed 's/^X//' << 'SHAR_EOF' > 'cool_elk.c' &&
  151. X/*
  152. X * ELK loader for my COOL library.
  153. X *
  154. X * Place this file in the lib/ directory in the ELK distribution.
  155. X *
  156. X * This was my first attempt at connecting COOL and a Scheme.
  157. X * Pretty shakey but it works.  Try doing cool-msg-i with
  158. X * the Counter class in the COOL test files.
  159. X */
  160. X#include <scheme.h>
  161. X
  162. Xextern char *getenv();
  163. XObject V_Home;
  164. X
  165. Xtypedef void (*voidp)();
  166. X
  167. X#define    NARGS 8
  168. X#define    MAXSTR 512
  169. X#define BIGSTR(n)    (n >= MAXSTR)
  170. X
  171. X/* argv[0] is target method, argv[1] is message, other objects are args to it */
  172. Xstatic GENERIC do_cool_msg (argc, argv) 
  173. XObject *argv; 
  174. X{
  175. X    char *coolob, *coolmeth, *args[NARGS];
  176. X    register i, n;
  177. X    unsigned long ret;
  178. X    voidp funcp;
  179. X
  180. X    Alloca_Begin;
  181. X    Check_Type (argv[0], T_String);
  182. X    n = STRING(argv[0])->size;
  183. X    Alloca (coolob, char*, n + 1);
  184. X    bcopy (STRING(argv[0])->data, coolob, n);
  185. X    coolob[n] = '\0';
  186. X    n = STRING(argv[1])->size;
  187. X    Alloca (coolmeth, char*, n + 1);
  188. X    bcopy (STRING(argv[1])->data, coolmeth, n);
  189. X    coolmeth[n] = '\0';
  190. X
  191. X    for(i = 0; i < 8; i++)
  192. X        args[i] = 0;
  193. X
  194. X    for(i = 0, n = argc - 2, argv += 2; n > 0; n--, i++) {
  195. X    switch(TYPE(argv[i])) {
  196. X        case T_Fixnum:
  197. X            args[i] = (GENERIC) FIXNUM(argv[i]);
  198. X            break;
  199. X        case T_String:
  200. X            n = STRING(argv[i])->size;
  201. X            Alloca ((GENERIC) args[i], GENERIC, n+1);
  202. X            bcopy (STRING(argv[i])->data, (GENERIC) args[i], n);
  203. X            ((char *) args[i])[n] = '\0';
  204. X            break;
  205. X        default:
  206. X            Primitive_Error ("Type ~d: ", TYPE(argv[i]));
  207. X    }
  208. X    }
  209. X    /* This might make some machines happier.  I don't know. */
  210. X    switch(argc - 2) {
  211. X    case 0:        ret = cool_msg(coolob, coolmeth); 
  212. X            break;
  213. X    case 1:        ret = cool_msg(coolob, coolmeth, args[0]); 
  214. X            break;
  215. X    case 2:        ret = cool_msg(coolob, coolmeth, args[0], args[1]); 
  216. X            break;
  217. X    case 3:        ret = cool_msg(coolob, coolmeth, args[0], args[1],
  218. X              args[2], args[3]); 
  219. X            break;
  220. X    case 4:        ret = cool_msg(coolob, coolmeth, args[0], args[1],
  221. X              args[2], args[3], args[4]);
  222. X            break;
  223. X    case 5:        ret = cool_msg(coolob, coolmeth, args[0], args[1],
  224. X              args[2], args[3], args[4], args[5]);
  225. X            break;
  226. X    case 6:        ret = cool_msg(coolob, coolmeth, args[0], args[1],
  227. X              args[2], args[3], args[4], args[5], args[6]);
  228. X            break;
  229. X    case 7:        ret = cool_msg(coolob, coolmeth, args[0], args[1],
  230. X              args[2], args[3], args[4], args[5], args[6], args[7]);
  231. X            break;
  232. X    case 8:        ret = cool_msg(coolob, coolmeth, args[0], args[1],
  233. X              args[2], args[3], args[4], args[5], 
  234. X              args[6], args[7], args[8]);
  235. X            break;
  236. X    }
  237. X    Alloca_End;
  238. X    return (GENERIC) ret;
  239. X}
  240. X
  241. Xstatic Object P_cool_msg_void (argc, argv) Object *argv; {
  242. X    do_cool_msg(argc, argv);
  243. X    return Void;
  244. X}
  245. X
  246. Xstatic Object P_cool_msg_fixnum (argc, argv) Object *argv; {
  247. X    int n;
  248. X
  249. X    n = (int) do_cool_msg(argc, argv);
  250. X    return Make_Fixnum(n);
  251. X}
  252. X
  253. Xstatic Object P_cool_msg_string (argc, argv) Object *argv; {
  254. X    char *s;
  255. X
  256. X    s = (char *) do_cool_msg(argc, argv);
  257. X    return Make_String(s);
  258. X}
  259. X
  260. X/* how can I do this?  Pointers?
  261. Xstatic Object P_cool_msg_float (argc, argv) Object *argv; {
  262. X    n = do_cool_msg(argc, argv);
  263. X    return Make_Fixnum(n);
  264. X}
  265. X*/
  266. X
  267. Xinit_lib_cool () {
  268. X    cool_init();
  269. X    /* it's the only way! */
  270. X    Define_Primitive (P_cool_msg_void, "cool-msg", 2, 10, VARARGS);
  271. X    Define_Primitive (P_cool_msg_fixnum, "cool-msg-i", 2, 10, VARARGS);
  272. X    Define_Primitive (P_cool_msg_string, "cool-msg-s", 2, 10, VARARGS);
  273. X    /* Define_Primitive (P_cool_msg_float, "cool-msg-f", 2, 10, VARARGS); */
  274. X}
  275. X
  276. SHAR_EOF
  277. chmod 0644 cool_elk.c ||
  278. echo 'restore of cool_elk.c failed'
  279. Wc_c="`wc -c < 'cool_elk.c'`"
  280. test 3440 -eq "$Wc_c" ||
  281.     echo 'cool_elk.c: original size 3440, current size' "$Wc_c"
  282. fi
  283. # ============= cool_scm.c ==============
  284. if test -f 'cool_scm.c' -a X"$1" != X"-c"; then
  285.     echo 'x - skipping cool_scm.c (File already exists)'
  286. else
  287. echo 'x - extracting cool_scm.c (Text)'
  288. sed 's/^X//' << 'SHAR_EOF' > 'cool_scm.c' &&
  289. X
  290. X/*
  291. X * SCM interface for my COOL library.
  292. X *
  293. X * Based on a b-tree interface from Aubrey Jaffer, and much code pigging.
  294. X *
  295. X * Place this file in the src/ directory in the COOL distribution.
  296. X *
  297. X * You must configure the SCM makefile to use "-DINITS=" cool_init()
  298. X * AND coolscm_init() AND your COOL classes.
  299. X *
  300. X */
  301. X
  302. X#include "scm.h"
  303. X#include "cool.h"
  304. X#include "coolint.h"
  305. X
  306. X/* assume nargs == 8 */
  307. Xtypedef unsigned long u_long;
  308. X
  309. Xstatic unsigned long argval[9];
  310. Xstatic char *scmtypes[9];
  311. Xstatic char **ctypes;
  312. X
  313. Xint dubs = 0;
  314. Xdouble dub[9][16];
  315. X
  316. Xstatic void getvalue();
  317. X
  318. X/* later: rip out as subroutine and do ret-void, ret-num, ret-str, ret-float */
  319. Xstatic char s_cool_msg[] = "cool-msg";
  320. X
  321. XSCM cool_domsg(o, m, args)
  322. X     SCM o, m, args;
  323. X{
  324. X    int i, j, nargs, foundargs, foundit;
  325. X    object_t ob;
  326. X    method_t msg, nmsg;
  327. X    char name[20], *rtype, *s;
  328. X    unsigned long ret32;
  329. X    double retd;
  330. X
  331. X    ASSERT(INUMP(o) || STRINGP(o),o,ARG1,s_cool_msg);
  332. X    ASSERT(INUMP(m) || STRINGP(m),m,ARG2,s_cool_msg);
  333. X    getvalue(o, &ob, (char *) 0, 0);
  334. X    getvalue(m, &msg, (char *) 0, 0);
  335. X    strcpy(name, (char *) msg);
  336. X    
  337. X    dubs = 0;    /* set up doubles marching */
  338. X
  339. X    /* copy argument list into argument area */
  340. X    if NNULLP(args) {
  341. X        SCM *lloc = &args;
  342. X        /* args points to a list of arguments, each in the CAR */
  343. X        for(foundargs = 0; NNULLP(*lloc); foundargs++) {
  344. X            getvalue(CAR(*lloc), &argval[foundargs], 
  345. X                &scmtypes[foundargs], 1);
  346. X            lloc = &CDR(*lloc);
  347. X        }
  348. X    }
  349. X    ob = cool_object(ob);
  350. X    msg = cool_method(ob, msg);
  351. X
  352. X    /* walkmethods test */
  353. X    if (s = strchr(name, ':'))
  354. X        *s = '\0';
  355. X    if (s = strchr(name, '='))
  356. X        *s = '\0';
  357. X    if (s = strchr(name, ','))
  358. X        *s = '\0';
  359. X    foundit = 0;
  360. X    nmsg = (method_t) -1;
  361. X    while(cool_walkmethods(ob, name, &nmsg, &rtype, &nargs, &ctypes)) {
  362. X/*
  363. X        printf("walk %s", name);
  364. X        if (rtype)
  365. X            printf("=%s", (rtype > 100) : rtype ? itoa(rtype));
  366. X        if (scmtypes[0]) 
  367. X            for(i = 0; j = scmtype[i]; i++)
  368. X                printf("%s%s", i ? "," : ":", 
  369. X                    (j > 100) : j ? itoa(j));
  370. X        printf("\n");
  371. X*/
  372. X        if (nargs != foundargs) 
  373. X            continue;
  374. X        /* No argument list to check.  Just take it and go. */
  375. X        if (! scmtypes[0]) {
  376. X            foundit = 1;
  377. X            break;
  378. X        }
  379. X
  380. X        for(i = 0; i < nargs; i++) {
  381. X            /* do type-matching */
  382. X            if (((scmtypes[i] == CINT) || (scmtypes[i] == CSTR))
  383. X                    && (ctypes[i] == COBJ))
  384. X                cool_object(argval[i]);    /* check */
  385. X/* ??    else if ((scmtypes[i] == CINT) && (ctypes[i] == CBOOL))*/
  386. X            /* there's more here, but... */
  387. X            else if (scmtypes[i] != ctypes[i])
  388. X                goto next;
  389. X            /* without an object, we can't check a method */
  390. X        }
  391. X        foundit = 1;
  392. X        break;
  393. X
  394. X        next:;
  395. X    }
  396. X
  397. X    if (foundit)
  398. X        msg = nmsg;
  399. X
  400. X    if (rtype == CDBL) {
  401. X        retd = (double) cool_msg(ob, msg, argval[0], argval[1],
  402. X                argval[2], argval[3], argval[4], 
  403. X                argval[5], argval[6], argval[7]);
  404. X        return(makdbl(retd, 0.0));
  405. X    }
  406. X    ret32 = (u_long) cool_msg(ob, msg, argval[0], argval[1],
  407. X            argval[2], argval[3], argval[4], 
  408. X            argval[5], argval[6], argval[7]);
  409. X    switch ((int) rtype) {
  410. X        case 0:
  411. X            return BOOL_T;    /* no return type specified */
  412. X        case (int) CVOID:
  413. X            return EOL;    /* empty list */
  414. X        case (int) CINT:
  415. X            ASSERT(ret32 < 0xc0000000,ret32,"cool int",s_cool_msg);
  416. X            return MAKINUM(ret32);
  417. X        case (int) CBOOL:
  418. X            return ret32 ? BOOL_T : BOOL_F;
  419. X        case (int) CCHAR:
  420. X            ASSERT(ret32 < 256, ret32,"cool char",s_cool_msg);
  421. X            return MAKICHR(ret32);
  422. X        case (int) CSTR:
  423. X            return make_string((char *)ret32,strlen((char *)ret32));
  424. X        case (int) COBJ:
  425. X            return MAKINUM(cool_object(ret32));
  426. X        case (int) CMSG:
  427. X            return MAKINUM(ret32);    /* Can't check methods! */
  428. X        case (int) CIVECT:
  429. X            /* copy data structure */
  430. X        case (int) CDVECT:
  431. X            /* copy data structure */
  432. X/* outlawed    case (int) CANY:     */
  433. X        default:
  434. X            break;
  435. X            /* it's a string, so it's a class name? */
  436. X            /* enforce that it be an object in that class */
  437. X    }
  438. X    return BOOL_T;
  439. X}
  440. X
  441. Xstatic void 
  442. Xgetvalue(x, valp, typep, dup)
  443. XSCM x;
  444. Xunsigned long *valp;
  445. Xchar **typep;
  446. Xint dup;
  447. X{
  448. X    char *s, *t;
  449. X    int i, j, l, l2;
  450. X    double *dptr;
  451. X    SCM *ptr, *ptr2, *nump;
  452. X
  453. X    if (!typep)
  454. X        typep = &t;
  455. X
  456. X    if IMP(x) {
  457. X        /* handle immediate cases */
  458. X        if INUMP(x) {
  459. X            *valp = (unsigned long) INUM(x);
  460. X            *typep = CINT;
  461. X        } else  if (x == BOOL_T) {
  462. X            *valp = 1;
  463. X            *typep = CINT;
  464. X        } else  if (x == BOOL_F) {
  465. X            *valp = 0;
  466. X            *typep = CINT;
  467. X        } else  if ICHRP(x) {
  468. X            *valp = ICHR(x);
  469. X            *typep = CCHAR;
  470. X        } else
  471. X            wta(x, "COOL doesn't grok this immediate type", s_cool_msg);
  472. X    } else {
  473. X        if STRINGP(x) {
  474. X    /*
  475. X            *valp = cool_malloc(LENGTH(x) + 1);
  476. X            strcpy(*valp, CHARS(x), LENGTH(x));
  477. X    */
  478. X        /* not needed, but paranoid until COOL customized for SCM GC. */
  479. X            if (dup)
  480. X                *valp = (unsigned long) cool_strdup(CHARS(x));
  481. X            else
  482. X                *valp = (unsigned long) CHARS(x);
  483. X            *typep = CSTR;
  484. X        } else if VECTORP(x) {
  485. X/* Only handles 3 or 4-value points and [34]x[34] matrices */
  486. X            l = LENGTH(x);
  487. X            ptr = VELTS(x);
  488. X            /* translate ints or floats into vector of doubles */
  489. X            dptr = dub[dubs++];
  490. X            *valp = (unsigned long) dptr;
  491. X            if (NVECTORP(ptr[0])) {
  492. X                *typep = CDPOINT;
  493. X                for(i = 0; i < l; i++) {
  494. X                    if (INUMP(ptr[i])) {
  495. X                        *dptr++ = (double) INUM(ptr[i]);
  496. X                    } else if (REALP(ptr[i])) {
  497. X                        *dptr++ = REALPART(ptr[i]);
  498. X                    } else 
  499. Xwta(x, "COOL:vector must be of ints or floats", s_cool_msg);
  500. X                }
  501. X                if (l == 3) {
  502. X                    *dptr++ = 0.0;
  503. X                } else if (l != 4)
  504. Xwta(x, "COOL:vector must be 4 items long", s_cool_msg);
  505. X            } else  {
  506. X                *typep = CDHOMOG;
  507. X                for(i = 0; i < l; i++) {
  508. X                    ptr2 = (SCM *) ptr[i];
  509. X                    if (NVECTORP(ptr2))
  510. Xwta(x, "COOL:matrix must be vectors of ints or floats", s_cool_msg);
  511. X                    l2 = LENGTH(ptr2);
  512. X                    nump = VELTS(ptr2);
  513. X                    for(j = 0; j < l2; j++) {
  514. X                        if (INUMP(nump[j])) {
  515. X                          *dptr++=(double)INUM(nump[j]);
  516. X                        } else if (REALP(nump[j])) {
  517. X                          *dptr++ = REALPART(nump[j]);
  518. X                        } else 
  519. Xwta(x, "COOL:matrix must be vectors of ints or floats", s_cool_msg);
  520. X                    }
  521. X                    if (l2 == 3) {
  522. X                        *dptr++ = 0.0;
  523. X                    }
  524. X                    else if (l2 != 4)
  525. Xwta(x, "COOL:vector must be 4 items long", s_cool_msg);
  526. X                }
  527. X                if (l == 3) {
  528. X                    *dptr++ = 0.0;
  529. X                    *dptr++ = 0.0;
  530. X                    *dptr++ = 0.0;
  531. X                    *dptr++ = 0.0;
  532. X                } else if (l != 4)
  533. Xwta(x, "COOL:vector must be 4 items long", s_cool_msg);
  534. X            }
  535. X    /* A matrix is a vector of 4 vectors of 3 or 4 ints/doubles */
  536. X        } else
  537. X            wta(x, "COOL doesn't (yet) grok this non-imm type", 
  538. X                s_cool_msg);
  539. X    }
  540. X}
  541. X
  542. Xstatic iproc lsubr2s[]={
  543. X    {s_cool_msg,cool_domsg},
  544. X    {0,0}};
  545. X
  546. Xvoid coolscm_init()
  547. X{
  548. X    init_iprocs(lsubr2s, tc7_lsubr_2);
  549. X}
  550. X
  551. X
  552. X
  553. SHAR_EOF
  554. chmod 0644 cool_scm.c ||
  555. echo 'restore of cool_scm.c failed'
  556. Wc_c="`wc -c < 'cool_scm.c'`"
  557. test 6375 -eq "$Wc_c" ||
  558.     echo 'cool_scm.c: original size 6375, current size' "$Wc_c"
  559. fi
  560. exit 0
  561. -- 
  562.  
  563. Lance Norskog
  564.  
  565. Data is not information is not knowledge is not wisdom.
  566.