home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume40 / dbf / part01 < prev    next >
Encoding:
Text File  |  1993-11-01  |  69.5 KB  |  3,223 lines

  1. Newsgroups: comp.sources.misc
  2. From: beacker@tomahawk.asd.sgi.com (Brad Eacker)
  3. Subject: v40i073:  dbf - xbase manipulation package, Part01/01
  4. Message-ID: <1993Nov1.221353.9979@sparky.sterling.com>
  5. X-Md4-Signature: d8c43c2ae245e2bba4f3ff6759f2b29e
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Mon, 1 Nov 1993 22:13:53 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: beacker@sgi.com (Brad Eacker)
  12. Posting-number: Volume 40, Issue 73
  13. Archive-name: dbf/part01
  14. Environment: xbase
  15.  
  16. DBF is a set of tools and library routines to manipulate xbase files.
  17.  
  18.         dbflst [-v] <file>
  19.  
  20. is used to list all the records in the file out to the stdout
  21.  
  22.         dbfget [-v] <file> [<record> <record>...]
  23.  
  24. lists to stdout the specified records
  25.  
  26.         dbfadd <file> <field> <field> ...
  27.  
  28. used to add a record to the end of a .dbf file
  29.  
  30.         dbfdel <file> [<record> <record> ...]
  31.  
  32. allows you to mark as deleted a record in a .dbf file
  33.  
  34.         dbfpack <file>
  35.  
  36. removes deleted records from the specified .dbf file
  37.  
  38.     tmpl
  39.  
  40. builds the tmpl.dbf.  This .dbf file is the one that all others get built from
  41.  
  42.     dbfcreat [-v] <file> <target xbase>
  43.  
  44. is used to create a database from a properly structured database that
  45. uses the field structure defined in tmpl.dbf
  46.  
  47. This package also includes a basic grammar recognizer for xbase .prg files
  48.  
  49. To build this package, make should be able to build it just fine.  It has
  50. been built on a couple of machine types.  Though you may need to take a
  51. look at the defines at the top of the makefile to see if you need to
  52. modify it to build in your environment.
  53.  
  54. Author: Brad Eacker
  55. beacker@sgi.com
  56. -----
  57. #! /bin/sh
  58. # This is a shell archive.  Remove anything before this line, then unpack
  59. # it by saving it into a file and typing "sh file".  To overwrite existing
  60. # files, type "sh file -c".  You can also feed this as standard input via
  61. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  62. # will see the following message at the end:
  63. #        "End of shell archive."
  64. # Contents:  README dbf.h dbf_head.c dbf_rec.c dbf_misc.c dbftst.c
  65. #   dbflst.c token.l gram.y dbinter.c dbf_sym.h yyerr.c tmpl.c
  66. #   dbfadd.c dbfdel.c dbfpack.c dbfget.c dbf_ndx.h dbf_ndx.c dbfndx.c
  67. #   dbfcreat.c Makefile HISTORY
  68. # Wrapped by beacker@tomahawk on Wed Oct 27 17:27:05 1993
  69. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  70. if test -f 'README' -a "${1}" != "-c" ; then 
  71.   echo shar: Will not clobber existing file \"'README'\"
  72. else
  73. echo shar: Extracting \"'README'\" \(2251 characters\)
  74. sed "s/^X//" >'README' <<'END_OF_FILE'
  75. XDBF
  76. X
  77. Xby Brad Eacker
  78. XMusic, Intuition, Software, and Computers (MISC)
  79. X
  80. XDBF is a set of tools and library routines to manipulate xbase files.
  81. X
  82. X        dbflst [-v] <file>
  83. X
  84. Xis used to list all the records in the file out to the stdout
  85. X
  86. X        dbfget [-v] <file> [<record> <record>...]
  87. X
  88. Xlists to stdout the specified records
  89. X
  90. X        dbfadd <file> <field> <field> ...
  91. X
  92. Xused to add a record to the end of a .dbf file
  93. X
  94. X        dbfdel <file> [<record> <record> ...]
  95. X
  96. Xallows you to mark as deleted a record in a .dbf file
  97. X
  98. X        dbfpack <file>
  99. X
  100. Xremoves deleted records from the specified .dbf file
  101. X
  102. X    tmpl
  103. X
  104. Xbuilds the tmpl.dbf.  This .dbf file is the one that all others get built from
  105. X
  106. X    dbfcreat [-v] <file> <target xbase>
  107. X
  108. Xis used to create a database from a properly structured database that
  109. Xuses the field structure defined in tmpl.dbf
  110. X
  111. XThis package also includes a basic grammar recognizer for xbase .prg files
  112. X
  113. XTo build this package, make should be able to build it just fine.  It has
  114. Xbeen built on a couple of machine types.  Though you may need to take a
  115. Xlook at the defines at the top of the makefile to see if you need to
  116. Xmodify it to build in your environment.
  117. X
  118. X    DBF - xbase manipulation package
  119. X        Copyright (c) Brad Eacker, 1991, 1992, 1993
  120. X
  121. X        Permission is granted to distribute and use the source,
  122. X        documentation files and/or compiled binaries associated with dbf
  123. X        for non-commercial use. No charges may be made for such
  124. X        distributions.
  125. X
  126. X        This notice and a all documentation must be passed along with
  127. X        all distributed copies.
  128. X
  129. X        No responsibility is taken for any errors or inaccuracies
  130. X        inherent either to the documentation or the code for this
  131. X        program, but, if reported to me, an attempt will be made to fix
  132. X        them.
  133. X
  134. X    Author: Brad Eacker
  135. X        beacker@sgi.com
  136. X
  137. XNO WARRANTY
  138. X    THERE IS NO WARRANTY FOR THIS PROGRAM, TO THE EXTENT PERMITTED
  139. X    BY APPLICABLE LAW.  THIS SET OF PROGRAMS IS PROVIDED "AS IS"
  140. X    WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED.
  141. X
  142. X    IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR DAMAGES,
  143. X    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
  144. X    DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THESE
  145. X    PROGRAMS.
  146. X
  147. X$Revision: 1.4 $
  148. END_OF_FILE
  149. if test 2251 -ne `wc -c <'README'`; then
  150.     echo shar: \"'README'\" unpacked with wrong size!
  151. fi
  152. # end of 'README'
  153. fi
  154. if test -f 'dbf.h' -a "${1}" != "-c" ; then 
  155.   echo shar: Will not clobber existing file \"'dbf.h'\"
  156. else
  157. echo shar: Extracting \"'dbf.h'\" \(2198 characters\)
  158. sed "s/^X//" >'dbf.h' <<'END_OF_FILE'
  159. X/*
  160. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  161. X *              (Music, Intuition, Software, and Computers)
  162. X * All Rights Reserved
  163. X */
  164. X
  165. X/*
  166. X * dbf header structure on disk (pc dbase III)
  167. X *
  168. X *  Basic info taken from:
  169. X *    "File Formats for Popular PC Software"
  170. X *    Jeff Walden
  171. X *    (c) 1986 John Wiley & Sons, Inc.
  172. X */
  173. X
  174. X#ifndef    _DBF_H_
  175. X#define    _DBF_H_
  176. X
  177. X#if !defined(UCHAR)
  178. Xtypedef    unsigned char    u_char;
  179. X#endif
  180. X
  181. Xstruct dbf_dhead {
  182. X    u_char    dbh_dbt;        /* memo (dbt) file present */
  183. X    u_char    dbh_date[3];        /* last update YY, MM, DD */
  184. X    u_char    dbh_records[4];        /* number of records LE */
  185. X    u_char    dbh_hlen[2];        /* header length LE */
  186. X    u_char    dbh_rlen[2];        /* record length LE */
  187. X    u_char    dbh_res[20];        /* padding */
  188. X};
  189. X#define    DBH_DATE_YEAR    0        /* byte offset for year in dbh_date */
  190. X#define    DBH_DATE_MONTH    1
  191. X#define    DBH_DATE_DAY    2
  192. X
  193. X/*
  194. X * field description on disk
  195. X */
  196. X
  197. X#define    DBF_NAMELEN    11
  198. X
  199. Xstruct dbf_dfield {
  200. X    u_char    dbf_name[DBF_NAMELEN];    /* name of field */
  201. X    u_char    dbf_type;        /* type of field */
  202. X    u_char    dbf_fda[4];        /* something for dbase III */
  203. X    u_char    dbf_flen[2];        /* field length [and decimal if N] */
  204. X    u_char    dbf_res[14];        /* padding */
  205. X};
  206. X
  207. Xstruct db_field {
  208. X    u_char    db_fname[DBF_NAMELEN+1];    /* 0 terminated */
  209. X    u_char    db_type;        /* type of field */
  210. X    int    db_flen;        /* length of field */
  211. X    int    db_fdc;            /* number of decimals in field */
  212. X
  213. X    u_char    *db_format;        /* format for printing %s etc */
  214. X    int    db_foffset;        /* offset within record */
  215. X};
  216. Xtypedef struct db_field    dbfield_t;
  217. X
  218. Xstruct db_head {
  219. X    int    db_fd;
  220. X    u_char    db_dbt;            /* dbt present */
  221. X    u_char    db_date[9];        /* date of last update in db format */
  222. X    long    db_records;        /* number of records */
  223. X    int    db_hlen;        /* header length */
  224. X    int    db_rlen;        /* record length */
  225. X
  226. X    int    db_nfields;        /* number of fields */
  227. X    dbfield_t    *db_fields;    /* field info */
  228. X};
  229. Xtypedef struct db_head    dbhead_t;
  230. X
  231. X#define    DBH_TYPE_NORMAL    0x03
  232. X#define    DBH_TYPE_MEMO    0x83
  233. X
  234. X#define    VALID_RECORD    ' '
  235. X#define    DELETED_RECORD    '*'
  236. X
  237. Xextern dbhead_t *get_dbf_head();
  238. Xextern u_char *get_dbf_record();
  239. Xextern u_char *get_dbf_f_fmt();
  240. Xextern long get_long();
  241. Xextern unsigned char *db_cur_date();
  242. X
  243. X#if defined(MEMSET)
  244. X#define    bzero(_ptr, _len)    memset(_ptr, 0, _len)
  245. X#endif
  246. X
  247. X#endif    /* _DBF_H_ */
  248. END_OF_FILE
  249. if test 2198 -ne `wc -c <'dbf.h'`; then
  250.     echo shar: \"'dbf.h'\" unpacked with wrong size!
  251. fi
  252. # end of 'dbf.h'
  253. fi
  254. if test -f 'dbf_head.c' -a "${1}" != "-c" ; then 
  255.   echo shar: Will not clobber existing file \"'dbf_head.c'\"
  256. else
  257. echo shar: Extracting \"'dbf_head.c'\" \(4611 characters\)
  258. sed "s/^X//" >'dbf_head.c' <<'END_OF_FILE'
  259. X/*
  260. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  261. X *              (Music, Intuition, Software, and Computers)
  262. X * All Rights Reserved
  263. X */
  264. X
  265. X#include <stdio.h>
  266. X#include <fcntl.h>
  267. X
  268. X#include "dbf.h"
  269. X
  270. X/*
  271. X * get the header info from the file
  272. X *    basic header info & field descriptions
  273. X */
  274. Xdbhead_t *
  275. Xget_dbf_head(fd)
  276. Xint fd;
  277. X{
  278. X    dbhead_t *dbh;
  279. X    struct dbf_dhead  dbhead;
  280. X    dbfield_t *dbf, *cur_f;
  281. X    int ret, nfields, offset;
  282. X
  283. X    if ((dbh = (dbhead_t *)malloc(sizeof(dbhead_t))) == NULL)
  284. X        return NULL;
  285. X    if (lseek(fd, 0, 0) < 0)
  286. X        return NULL;
  287. X    if ((ret = read(fd, &dbhead, sizeof(dbhead))) < 0)
  288. X        return NULL;
  289. X
  290. X    /* build in core info */
  291. X    dbh->db_fd = fd;
  292. X    dbh->db_dbt = dbhead.dbh_dbt;
  293. X    dbh->db_records = get_long(dbhead.dbh_records);
  294. X    dbh->db_hlen = get_short(dbhead.dbh_hlen);
  295. X    dbh->db_rlen = get_short(dbhead.dbh_rlen);
  296. X
  297. X    db_set_date(dbh->db_date, dbhead.dbh_date[DBH_DATE_YEAR] + 1900,
  298. X        dbhead.dbh_date[DBH_DATE_MONTH],
  299. X        dbhead.dbh_date[DBH_DATE_DAY]);
  300. X
  301. X    dbh->db_nfields = nfields = (dbh->db_hlen - sizeof(struct dbf_dhead)) /
  302. X                sizeof(struct dbf_dfield);
  303. X
  304. X    /* get all the field info */
  305. X    dbf = (dbfield_t *)malloc(sizeof(dbfield_t) * nfields);
  306. X
  307. X    offset = 1;
  308. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  309. X        if (get_dbf_field(dbh, cur_f) < 0) {
  310. X            free_dbf_head(dbh);
  311. X            return NULL;
  312. X        }
  313. X        cur_f->db_foffset = offset;
  314. X        offset += cur_f->db_flen;
  315. X    }
  316. X    dbh->db_fields = dbf;
  317. X
  318. X    return dbh;
  319. X}
  320. X
  321. X/*
  322. X * free up the header info built above
  323. X */
  324. Xfree_dbf_head(dbh)
  325. Xdbhead_t *dbh;
  326. X{
  327. X    dbfield_t *dbf, *cur_f;
  328. X    int nfields;
  329. X    u_char *fp;
  330. X
  331. X    dbf = dbh->db_fields;
  332. X    nfields = dbh->db_nfields;
  333. X    for (cur_f = dbf; cur_f < &dbf[nfields]; cur_f++) {
  334. X        if (cur_f->db_format) {
  335. X            free(cur_f->db_format);
  336. X        }
  337. X    }
  338. X
  339. X    free(dbf);
  340. X    free(dbh);
  341. X}
  342. X
  343. X/*
  344. X * put out the header info
  345. X */
  346. Xput_dbf_head(dbh)
  347. Xdbhead_t *dbh;
  348. X{
  349. X    int fd = dbh->db_fd;
  350. X    struct dbf_dhead  dbhead;
  351. X    int    ret;
  352. X
  353. X    bzero(&dbhead, sizeof dbhead);
  354. X
  355. X    /* build on disk info */
  356. X    dbhead.dbh_dbt = dbh->db_dbt;
  357. X    put_long(dbhead.dbh_records, dbh->db_records);
  358. X    put_short(dbhead.dbh_hlen, dbh->db_hlen);
  359. X    put_short(dbhead.dbh_rlen, dbh->db_rlen);
  360. X
  361. X    /* put the date spec'd into the on disk header */
  362. X    dbhead.dbh_date[DBH_DATE_YEAR] =(u_char)(db_date_year(dbh->db_date) -
  363. X                        1900);
  364. X    dbhead.dbh_date[DBH_DATE_MONTH]=(u_char)(db_date_month(dbh->db_date));
  365. X    dbhead.dbh_date[DBH_DATE_DAY] =(u_char)(db_date_day(dbh->db_date));
  366. X
  367. X    if (lseek(fd, 0, 0) < 0)
  368. X        return -1;
  369. X    if ((ret = write(fd, &dbhead, sizeof(dbhead))) < 0)
  370. X        return -1;
  371. X}
  372. X
  373. X/*
  374. X * get a field off the disk from the current file offset
  375. X */
  376. Xget_dbf_field(dbh, dbf)
  377. Xdbhead_t *dbh;
  378. Xdbfield_t *dbf;
  379. X{
  380. X    struct dbf_dfield    dbfield;
  381. X    unsigned char    *scp, *dcp;
  382. X    unsigned char    format[100];
  383. X    int ret;
  384. X
  385. X    if ((ret = read(dbh->db_fd, &dbfield, sizeof(dbfield))) < 0) {
  386. X        return ret;
  387. X    }
  388. X
  389. X    /* build the field name */
  390. X    copy_crimp(dbf->db_fname, dbfield.dbf_name, DBF_NAMELEN);
  391. X
  392. X    dbf->db_type = dbfield.dbf_type;
  393. X    switch (dbf->db_type) {
  394. X        case 'N':
  395. X        dbf->db_flen = dbfield.dbf_flen[0];
  396. X        dbf->db_fdc = dbfield.dbf_flen[1];
  397. X        break;
  398. X        default:
  399. X            dbf->db_flen = get_short(dbfield.dbf_flen);
  400. X    }
  401. X
  402. X    if ((dbf->db_format = get_dbf_f_fmt(dbf)) == NULL) {
  403. X        return 1;
  404. X    }
  405. X
  406. X    return 0;
  407. X}
  408. X
  409. X/*
  410. X * put a field out on the disk at the current file offset
  411. X */
  412. Xput_dbf_field(dbh, dbf)
  413. Xdbhead_t *dbh;
  414. Xdbfield_t *dbf;
  415. X{
  416. X    struct dbf_dfield    dbfield;
  417. X    unsigned char        *scp, *dcp;
  418. X    int            c_left = DBF_NAMELEN;
  419. X    int            ret;
  420. X
  421. X    bzero(&dbfield, sizeof dbfield);
  422. X
  423. X    /* build the on disk field info */
  424. X    scp = dbf->db_fname; dcp = dbfield.dbf_name;
  425. X
  426. X    strncpy(dbfield.dbf_name, dbf->db_fname, DBF_NAMELEN);
  427. X
  428. X    dbfield.dbf_type = dbf->db_type;
  429. X    switch (dbf->db_type) {
  430. X        case 'N':        
  431. X        dbfield.dbf_flen[0] = dbf->db_flen;
  432. X        dbfield.dbf_flen[1] = dbf->db_fdc;
  433. X        break;
  434. X        default:
  435. X            put_short(dbfield.dbf_flen, dbf->db_flen);
  436. X    }
  437. X
  438. X    /* now write it out to disk */
  439. X    if ((ret = write(dbh->db_fd, &dbfield, sizeof(dbfield))) < 0) {
  440. X        return ret;
  441. X    }
  442. X    return 1;
  443. X}
  444. X
  445. X/*
  446. X * put out all the info at the top of the file...
  447. X */
  448. Xstatic char end_stuff[2] = {0x0d, 0};
  449. X
  450. Xput_dbf_info(dbh)
  451. Xdbhead_t *dbh;
  452. X{
  453. X    dbfield_t    *dbf, *cur_f;
  454. X    int        fcnt;
  455. X
  456. X    put_dbf_head(dbh);
  457. X    dbf = dbh->db_fields;
  458. X    for (fcnt = dbh->db_nfields; fcnt > 0; fcnt--, dbf++)
  459. X        put_dbf_field(dbh, dbf);
  460. X    write(dbh->db_fd, end_stuff, 2);
  461. X}
  462. X
  463. Xu_char *
  464. Xget_dbf_f_fmt(dbf)
  465. Xdbfield_t *dbf;
  466. X{
  467. X    u_char format[100];
  468. X
  469. X    /* build the field format for printf */
  470. X    switch (dbf->db_type) {
  471. X       case 'C':
  472. X        sprintf(format, "%%-%ds", dbf->db_flen);
  473. X        break;
  474. X       case 'N':
  475. X       case 'L':
  476. X       case 'D':
  477. X        sprintf(format, "%%%ds", dbf->db_flen);
  478. X        break;
  479. X       case 'M':
  480. X        strcpy(format, "%s");
  481. X        break;
  482. X    }
  483. X    return (u_char *)strdup(format);
  484. X}
  485. END_OF_FILE
  486. if test 4611 -ne `wc -c <'dbf_head.c'`; then
  487.     echo shar: \"'dbf_head.c'\" unpacked with wrong size!
  488. fi
  489. # end of 'dbf_head.c'
  490. fi
  491. if test -f 'dbf_rec.c' -a "${1}" != "-c" ; then 
  492.   echo shar: Will not clobber existing file \"'dbf_rec.c'\"
  493. else
  494. echo shar: Extracting \"'dbf_rec.c'\" \(2274 characters\)
  495. sed "s/^X//" >'dbf_rec.c' <<'END_OF_FILE'
  496. X/*
  497. X * Copyright (c) 1993 Brad Eacker,
  498. X *              (Music, Intuition, Software, and Computers)
  499. X * All Rights Reserved
  500. X */
  501. X
  502. X#include <stdio.h>
  503. X#include <fcntl.h>
  504. X
  505. X#include "dbf.h"
  506. X
  507. X/*
  508. X * get a record off the database
  509. X */
  510. Xu_char *
  511. Xget_dbf_record(dbh, rec_num)
  512. Xdbhead_t *dbh;
  513. Xlong rec_num;
  514. X{
  515. X    long    offset;
  516. X    u_char    *cp;
  517. X
  518. X    if ((cp = (u_char *)malloc(dbh->db_rlen)) == NULL) {
  519. X        return NULL;
  520. X    }
  521. X    if (rec_num > dbh->db_records) {
  522. X        return NULL;
  523. X    }
  524. X
  525. X    /* go to the correct spot on the file */
  526. X    offset = dbh->db_hlen + (rec_num - 1) * dbh->db_rlen;
  527. X
  528. X    if ( lseek(dbh->db_fd, offset, 0) < 0 ) {
  529. X        free(cp);
  530. X        return NULL;
  531. X    }
  532. X
  533. X    /* read the record into the allocated space */
  534. X    if ( read(dbh->db_fd, cp, dbh->db_rlen) < 0 ) {
  535. X        free(cp);
  536. X        return NULL;
  537. X    }
  538. X
  539. X    return cp;
  540. X}
  541. X
  542. X/*
  543. X * get a record off the database
  544. X */
  545. Xput_dbf_record(dbh, rec_num, cp)
  546. Xdbhead_t *dbh;
  547. Xlong rec_num;
  548. Xu_char *cp;
  549. X{
  550. X    long    offset;
  551. X
  552. X    if (rec_num == 0) {
  553. X        rec_num = dbh->db_records;
  554. X    }
  555. X    if (rec_num > dbh->db_records) {
  556. X        return NULL;
  557. X    }
  558. X    /* go to the correct spot on the file */
  559. X    offset = dbh->db_hlen + (rec_num - 1) * dbh->db_rlen;
  560. X
  561. X    if ( lseek(dbh->db_fd, offset, 0) < 0 ) {
  562. X        return -1;
  563. X    }
  564. X
  565. X    /* write the record into the file */
  566. X    if ( write(dbh->db_fd, cp, dbh->db_rlen) < 0 ) {
  567. X        return -1;
  568. X    }
  569. X
  570. X    return rec_num;
  571. X}
  572. X
  573. Xdel_dbf_record(dbh, rec_num)
  574. Xdbhead_t *dbh;
  575. Xlong rec_num;
  576. X{
  577. X    int ret;
  578. X    u_char *cp;
  579. X
  580. X    if (rec_num > dbh->db_records)
  581. X        return -1;
  582. X    if (cp = get_dbf_record(dbh, rec_num)) {
  583. X        *cp = DELETED_RECORD;
  584. X        if ( (ret = put_dbf_record(dbh, rec_num, cp)) < 0 ) {
  585. X            return ret;
  586. X        }
  587. X    }
  588. X    return 0;
  589. X}
  590. X
  591. Xpack_dbf(dbh)
  592. Xdbhead_t *dbh;
  593. X{
  594. X    long    out_off, in_off;
  595. X    int    rec_cnt, new_cnt;
  596. X    u_char    *cp;
  597. X
  598. X    if ((cp = (u_char *)malloc(dbh->db_rlen)) == NULL) {
  599. X        return -1;
  600. X    }
  601. X    in_off = out_off = dbh->db_hlen;
  602. X
  603. X    new_cnt = 0;
  604. X    rec_cnt = dbh->db_records;
  605. X    while (rec_cnt > 0) {
  606. X        if ( lseek(dbh->db_fd, in_off, 0) < 0 )
  607. X            break;
  608. X        if ( read(dbh->db_fd, cp, dbh->db_rlen) < 0 )
  609. X            break;
  610. X
  611. X        if (*cp != DELETED_RECORD) {
  612. X            /* write the record into the file */
  613. X            if ( lseek(dbh->db_fd, out_off, 0) < 0 )
  614. X                break;
  615. X            if ( write(dbh->db_fd, cp, dbh->db_rlen) < 0 )
  616. X                break;
  617. X            out_off += dbh->db_rlen;
  618. X            new_cnt++;
  619. X        }
  620. X        in_off += dbh->db_rlen;
  621. X        rec_cnt--;
  622. X    }
  623. X    free(cp);
  624. X    if (rec_cnt == 0)
  625. X        dbh->db_records = new_cnt;
  626. X}
  627. END_OF_FILE
  628. if test 2274 -ne `wc -c <'dbf_rec.c'`; then
  629.     echo shar: \"'dbf_rec.c'\" unpacked with wrong size!
  630. fi
  631. # end of 'dbf_rec.c'
  632. fi
  633. if test -f 'dbf_misc.c' -a "${1}" != "-c" ; then 
  634.   echo shar: Will not clobber existing file \"'dbf_misc.c'\"
  635. else
  636. echo shar: Extracting \"'dbf_misc.c'\" \(2135 characters\)
  637. sed "s/^X//" >'dbf_misc.c' <<'END_OF_FILE'
  638. X/*
  639. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  640. X *              (Music, Intuition, Software, and Computers)
  641. X * All Rights Reserved
  642. X */
  643. X
  644. X/*
  645. X * routine to change little endian long to host long
  646. X */
  647. Xlong
  648. Xget_long(cp)
  649. Xunsigned char *cp;
  650. X{
  651. X    int ret;
  652. X
  653. X    ret = *cp++;
  654. X    ret += ((*cp++)<<8);
  655. X    ret += ((*cp++)<<16);
  656. X    ret += ((*cp++)<<24);
  657. X
  658. X    return ret;
  659. X}
  660. X
  661. Xput_long(cp, lval)
  662. Xunsigned char *cp;
  663. Xlong lval;
  664. X{
  665. X    *cp++ = lval & 0xff;
  666. X    *cp++ = (lval >> 8) & 0xff;
  667. X    *cp++ = (lval >> 16) & 0xff;
  668. X    *cp++ = (lval >> 24) & 0xff;
  669. X}
  670. X
  671. X/*
  672. X * routine to change little endian short to host short
  673. X */
  674. Xget_short(cp)
  675. Xunsigned char *cp;
  676. X{
  677. X    int ret;
  678. X
  679. X    ret = *cp++;
  680. X    ret += ((*cp++)<<8);
  681. X
  682. X    return ret;
  683. X}
  684. X
  685. Xput_short(cp, sval)
  686. Xunsigned char *cp;
  687. X{
  688. X    *cp++ = sval & 0xff;
  689. X    *cp++ = (sval >> 8) & 0xff;
  690. X}
  691. X
  692. Xcopy_fill(dp, sp, len)
  693. Xunsigned char    *dp, *sp;
  694. Xint        len;
  695. X{
  696. X    while (*sp && len > 0) {
  697. X        *dp++ = *sp++;
  698. X        len--;
  699. X    }
  700. X    while (len-- > 0)
  701. X        *dp++ = ' ';
  702. X}
  703. X
  704. Xcopy_crimp(dp, sp, len)
  705. Xunsigned char    *dp, *sp;
  706. Xint        len;
  707. X{
  708. X    while (len-- > 0) {
  709. X        *dp++ = *sp++;
  710. X    }
  711. X    *dp = 0;
  712. X    for (dp-- ; *dp == ' '; dp--) {
  713. X        *dp = 0;
  714. X    }
  715. X
  716. X}
  717. X
  718. Xdb_set_date(cp, year, month, day)
  719. Xunsigned char *cp;
  720. Xint year, month, day;
  721. X{
  722. X    if (month > 12)
  723. X        month = 0;
  724. X    if (day > 31)
  725. X        day = 0;
  726. X    sprintf(cp, "%d", year);
  727. X    cp[4] = month / 10 + '0';
  728. X    cp[5] = month % 10 + '0';
  729. X    cp[6] = day / 10 + '0';
  730. X    cp[7] = day % 10 + '0';
  731. X    cp[8] = 0;
  732. X}
  733. X
  734. Xdb_date_year(cp)
  735. Xunsigned char *cp;
  736. X{
  737. X    int    year, i;
  738. X
  739. X    for (year = 0, i = 0; i < 4; i++)
  740. X        year = year * 10 + (cp[i] - '0');
  741. X    return year;
  742. X}
  743. X
  744. Xdb_date_month(cp)
  745. Xunsigned char *cp;
  746. X{
  747. X    int    month, i;
  748. X
  749. X    for (month = 0, i = 4; i < 6; i++)
  750. X        month = month * 10 + (cp[i] - '0');
  751. X    return month;
  752. X}
  753. X
  754. Xdb_date_day(cp)
  755. Xunsigned char *cp;
  756. X{
  757. X    int    day, i;
  758. X
  759. X    for (day = 0, i = 6; i < 8; i++)
  760. X        day = day * 10 + (cp[i] - '0');
  761. X    return day;
  762. X}
  763. X
  764. X#include <time.h>
  765. X
  766. Xunsigned char *
  767. Xdb_cur_date(cp)
  768. Xunsigned char *cp;
  769. X{
  770. X    struct tm *ctm;
  771. X    time_t      c_time;
  772. X
  773. X    c_time = time((time_t *)NULL);
  774. X    ctm = localtime(&c_time);
  775. X    if (cp == NULL)
  776. X        cp = (unsigned char *)malloc(9);
  777. X
  778. X    if (ctm == NULL || cp == NULL)
  779. X        return NULL;
  780. X
  781. X    db_set_date(cp, ctm->tm_year + 1900, ctm->tm_mon + 1, ctm->tm_mday);
  782. X
  783. X    return cp;
  784. X}
  785. END_OF_FILE
  786. if test 2135 -ne `wc -c <'dbf_misc.c'`; then
  787.     echo shar: \"'dbf_misc.c'\" unpacked with wrong size!
  788. fi
  789. # end of 'dbf_misc.c'
  790. fi
  791. if test -f 'dbftst.c' -a "${1}" != "-c" ; then 
  792.   echo shar: Will not clobber existing file \"'dbftst.c'\"
  793. else
  794. echo shar: Extracting \"'dbftst.c'\" \(1103 characters\)
  795. sed "s/^X//" >'dbftst.c' <<'END_OF_FILE'
  796. X/*
  797. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  798. X *              (Music, Intuition, Software, and Computers)
  799. X * All Rights Reserved
  800. X */
  801. X
  802. X#define    USAGE    "usage: dbftst <file>\n"
  803. X
  804. X/*
  805. X * test routine to check out the header and fields
  806. X */
  807. X#include <stdio.h>
  808. X#include <fcntl.h>
  809. X
  810. X#include "dbf.h"
  811. X
  812. Xmain(argc, argv)
  813. Xint    argc;
  814. Xchar    **argv;
  815. X{
  816. X    dbhead_t     *dbh;
  817. X    dbfield_t    *dbf, *cur_f;
  818. X    int    fd, nfields;
  819. X    u_char    *cp;
  820. X
  821. X    if (argc < 2) {
  822. X        printf(USAGE);
  823. X        exit(1);
  824. X    }
  825. X    argv++;
  826. X    if ((fd = open(*argv, O_RDONLY)) < 0) {
  827. X        cp = (u_char *)malloc(256);
  828. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  829. X        if ((fd = open(cp, O_RDONLY)) < 0) {
  830. X            perror("open");
  831. X            exit(1);
  832. X        }
  833. X        free(cp);
  834. X    }
  835. X
  836. X    /* go get the header */
  837. X    if ((dbh = get_dbf_head(fd)) == NULL) {
  838. X        fprintf(stderr, "Unable to get header\n");
  839. X        exit(1);
  840. X    }
  841. X
  842. X    nfields = dbh->db_nfields;
  843. X
  844. X    printf("# fields: %d, record len: %d\n", nfields, dbh->db_rlen);
  845. X
  846. X    /* step thru the field info */
  847. X    dbf = dbh->db_fields;
  848. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  849. X        printf("  %s, %c, %d, %d\n", cur_f->db_fname, cur_f->db_type,
  850. X            cur_f->db_flen, cur_f->db_fdc);
  851. X    }
  852. X}
  853. END_OF_FILE
  854. if test 1103 -ne `wc -c <'dbftst.c'`; then
  855.     echo shar: \"'dbftst.c'\" unpacked with wrong size!
  856. fi
  857. # end of 'dbftst.c'
  858. fi
  859. if test -f 'dbflst.c' -a "${1}" != "-c" ; then 
  860.   echo shar: Will not clobber existing file \"'dbflst.c'\"
  861. else
  862. echo shar: Extracting \"'dbflst.c'\" \(2370 characters\)
  863. sed "s/^X//" >'dbflst.c' <<'END_OF_FILE'
  864. X/*
  865. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  866. X *              (Music, Intuition, Software, and Computers)
  867. X * All Rights Reserved
  868. X */
  869. X
  870. X#define    USAGE    "usage: dbflst [-v] <file>\n"
  871. X
  872. X/*
  873. X * display the database in question to the stdout
  874. X */
  875. X#include <stdio.h>
  876. X#include <fcntl.h>
  877. X
  878. X#include "dbf.h"
  879. X
  880. Xmain(argc, argv)
  881. Xint    argc;
  882. Xchar    **argv;
  883. X{
  884. X    dbhead_t     *dbh;
  885. X    dbfield_t    *dbf, *cur_f;
  886. X    char    *fnp;
  887. X    u_char    *cp;
  888. X    int    fd, nfields;
  889. X    int    rec_cnt, i;
  890. X    extern int optind;
  891. X    extern char *optarg;
  892. X    int    verbose = 0;
  893. X
  894. X    if (argc < 2) {
  895. X        printf(USAGE);
  896. X        exit(1);
  897. X    }
  898. X    while ((i = getopt(argc, argv, "v")) != EOF) {
  899. X        switch (i) {
  900. X            case 'v':
  901. X            verbose++;
  902. X            break;
  903. X            default:
  904. X            printf(USAGE);
  905. X            exit(1);
  906. X        }
  907. X    }
  908. X    argc -= optind;  argv = &argv[optind];
  909. X    if ((fd = open(*argv, O_RDONLY)) < 0) {
  910. X        cp = (u_char *)malloc(256);
  911. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  912. X        if ((fd = open(cp, O_RDONLY)) < 0) {
  913. X            perror("open");
  914. X            exit(1);
  915. X        }
  916. X        free(cp);
  917. X    }
  918. X
  919. X    if ((dbh = get_dbf_head(fd)) ==     0) {
  920. X        fprintf(stderr, "Unable to get header\n");
  921. X        exit(1);
  922. X    }
  923. X    nfields = dbh->db_nfields;
  924. X    if (verbose) {
  925. X        printf("# fields: %d, record len: %d, total records %d\n",
  926. X            nfields, dbh->db_rlen, dbh->db_records);
  927. X    }
  928. X    dbf = dbh->db_fields;
  929. X    if (verbose) {
  930. X        for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  931. X            printf("# %s, %c, %d, %d\n", cur_f->db_fname,
  932. X                cur_f->db_type, cur_f->db_flen, cur_f->db_fdc);
  933. X        }
  934. X    }
  935. X
  936. X    /* put out the field headings */
  937. X    printf(" ");
  938. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  939. X        fnp = (char *)strdup(cur_f->db_fname);
  940. X        if (strlen(fnp) > cur_f->db_flen) {
  941. X            fnp[cur_f->db_flen] = 0;
  942. X        }
  943. X        printf(" ");
  944. X        printf(cur_f->db_format, fnp);
  945. X        free((char *)fnp);
  946. X    }
  947. X    printf("\n");
  948. X
  949. X    /* step thru the records */
  950. X    for (rec_cnt = 1; rec_cnt <= dbh->db_records; rec_cnt++) {
  951. X        if ((cp = get_dbf_record(dbh, rec_cnt)) == NULL) {
  952. X            printf("tried to read bad record %d\n", rec_cnt);
  953. X            break;
  954. X        }
  955. X        out_rec(dbh, dbf, cp);
  956. X        free(cp);
  957. X    }
  958. X}
  959. X
  960. X/*
  961. X * output a record
  962. X */
  963. Xout_rec(dbh, dbf, cp)
  964. Xdbhead_t    *dbh;
  965. Xdbfield_t    *dbf;
  966. Xchar    *cp;
  967. X{
  968. X    dbfield_t    *cur_f;
  969. X    int    nfields = dbh->db_nfields;
  970. X    char    *fnp = (char *)alloca(dbh->db_rlen);
  971. X
  972. X    printf("%c", *cp++);
  973. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  974. X        printf(" ");
  975. X        strncpy(fnp, cp, cur_f->db_flen);
  976. X        fnp[cur_f->db_flen] = 0;
  977. X        printf(cur_f->db_format, fnp);
  978. X        cp += cur_f->db_flen;
  979. X    }
  980. X    printf("\n");
  981. X}
  982. END_OF_FILE
  983. if test 2370 -ne `wc -c <'dbflst.c'`; then
  984.     echo shar: \"'dbflst.c'\" unpacked with wrong size!
  985. fi
  986. # end of 'dbflst.c'
  987. fi
  988. if test -f 'token.l' -a "${1}" != "-c" ; then 
  989.   echo shar: Will not clobber existing file \"'token.l'\"
  990. else
  991. echo shar: Extracting \"'token.l'\" \(7070 characters\)
  992. sed "s/^X//" >'token.l' <<'END_OF_FILE'
  993. X%{
  994. X/*
  995. X * Copyright (c) 1991, 1992 Brad Eacker,
  996. X *              (Music, Intuition, Software, and Computers)
  997. X * All Rights Reserved
  998. X */
  999. X/*
  1000. X *    tokenizer for dbf
  1001. X */
  1002. X#ifdef DEBUG        /* debugging version */
  1003. Xmain()
  1004. X{
  1005. X    char    *p;
  1006. X
  1007. X    while (p = (char *)yylex())
  1008. X        printf("%-10.10s is \"%s\"\n", p, yytext);
  1009. X}
  1010. X
  1011. Xs_lookup() {}
  1012. Xyymark() {}
  1013. X
  1014. Xint yynerrrs = 0;
  1015. X
  1016. X#define    token(x)    (int) "x"
  1017. X
  1018. X#else /* ! DEBUG (ie production version) */
  1019. X
  1020. X#include "gram.tab.h"
  1021. X#define token(x)    x
  1022. X
  1023. X#endif /* DEBUG */
  1024. X
  1025. X#define    END_OF(v)    (v-1 + sizeof v / sizeof v[0])
  1026. Xstatic int screen();
  1027. X%}
  1028. X
  1029. Xletter            [a-zA-Z_]
  1030. Xdigit            [0-9]
  1031. Xletter_or_digit        [a-zA-Z0-9_]
  1032. Xcar_ret            [\n]
  1033. Xblank            [ \t]
  1034. Xslash            [/]
  1035. Xdouble_quote        ["]
  1036. Xsingle_quote        [']
  1037. Xnot_d_quote        [^"]
  1038. Xnot_s_quote        [^']
  1039. Xother            .
  1040. Xperiod            [.]
  1041. X
  1042. X%%
  1043. X
  1044. X";"{car_ret}        ;
  1045. X{car_ret}        return token(CR);
  1046. X
  1047. X^{blank}*"*".*\n    ;
  1048. X"&&".*\n        return token(CR);
  1049. X
  1050. X{period}        return token(PERIOD);
  1051. X
  1052. X{double_quote}{not_d_quote}*{double_quote}        return token(STRING);
  1053. X{single_quote}{not_s_quote}*{single_quote}        return token(STRING);
  1054. X
  1055. X"("            return token(L_PAREN);
  1056. X")"            return token(R_PAREN);
  1057. X"@"            return token(AT);
  1058. X"?"            return token(QUEST);
  1059. X"??"            return token(QUEST);
  1060. X"&"            return token(AMPER);
  1061. X
  1062. X"*"            return token(MULT);
  1063. X"/"            return token(DIVIDE);
  1064. X
  1065. X"+"            return token(PLUS);
  1066. X"-"            return token(MINUS);
  1067. X
  1068. X","            return token(COMMA);
  1069. X";"            ;
  1070. X":"            return token(COLON);
  1071. X"!"            return token(BANG);
  1072. X
  1073. X"="            return token(EQUAL);
  1074. X"<>"            return token(NOT_EQUAL);
  1075. X">"            return token(GREATER);
  1076. X">="            return token(GREATER_EQUAL);
  1077. X"<"            return token(LESS);
  1078. X"<="            return token(LESS_EQUAL);
  1079. X"$"            return token(DOLLAR);
  1080. X"->"            return token(PTR);
  1081. X
  1082. X"\.OR\."        return token(OR);
  1083. X"\.AND\."        return token(AND);
  1084. X"\.NOT\."        return token(NOT);
  1085. X
  1086. X{letter}{letter_or_digit}*    {
  1087. X#ifdef DEBUG
  1088. X                return screen();
  1089. X#else
  1090. X                int retval;
  1091. X                if ((retval = screen()) == token(Identifier)){
  1092. X                    s_lookup(token(Identifier));
  1093. X                }
  1094. X                return retval;
  1095. X#endif
  1096. X                }
  1097. X{digit}+            { s_lookup(token(Constant));
  1098. X                  return token(Constant);
  1099. X                }
  1100. X{period}{digit}+        { s_lookup(token(Constant));
  1101. X                  return token(Constant);
  1102. X                }
  1103. X{digit}+{period}{digit}+    { s_lookup(token(Constant));
  1104. X                  return token(Constant);
  1105. X                }
  1106. X
  1107. X{blank}+            ;
  1108. X
  1109. X{other}                return token(yytext[0]);
  1110. X
  1111. X%%
  1112. X
  1113. Xstatic struct rwtable {        /* reserved word table */
  1114. X    char    *rw_name;    /* representations */
  1115. X    int    rw_yylex;    /* yylex(value) */
  1116. X} rwtable[] = {            /* sorted */
  1117. X    "ACCE",        token(ACCEPT),
  1118. X    "ACCEPT",    token(ACCEPT),
  1119. X    "ALIA",        token(ALIAS),
  1120. X    "ALIAS",    token(ALIAS),
  1121. X    "ALL",        token(ALL),
  1122. X    "APPE",        token(APPEND),
  1123. X    "APPEND",    token(APPEND),
  1124. X    "ASSI",        token(ASSIST),
  1125. X    "ASSIST",    token(ASSIST),
  1126. X    "AVER",        token(AVERAGE),
  1127. X    "AVERAGE",    token(AVERAGE),
  1128. X    "BLAN",        token(BLANK),
  1129. X    "BLANK",    token(BLANK),
  1130. X    "BOTTOM",    token(BOTTOM),
  1131. X    "BROW",        token(BROWSE),
  1132. X    "BROWSE",    token(BROWSE),
  1133. X    "CALL",        token(CALL),
  1134. X    "CANC",        token(CANCEL),
  1135. X    "CANCEL",    token(CANCEL),
  1136. X    "CASE",        token(CASE),
  1137. X    "CHANGE",    token(CHANGE),
  1138. X    "CLEA",        token(CLEAR),
  1139. X    "CLEAR",    token(CLEAR),
  1140. X    "CLOS",        token(CLOSE),
  1141. X    "CLOSE",    token(CLOSE),
  1142. X    "CONT",        token(CONTINUE),
  1143. X    "CONTINUE",    token(CONTINUE),
  1144. X    "COPY",        token(COPY),
  1145. X    "COUNT",    token(COUNT),
  1146. X    "DATABASES",    token(DATABASES),
  1147. X    "DELETE",    token(DELETE),
  1148. X    "DELI",        token(DELIMITED),
  1149. X    "DELIMITED",    token(DELIMITED),
  1150. X    "DISP",        token(DISPLAY),
  1151. X    "DISPLAY",    token(DISPLAY),
  1152. X    "DO",        token(DO),
  1153. X    "EDIT",        token(EDIT),
  1154. X    "EJEC",        token(EJECT),
  1155. X    "EJECT",    token(EJECT),
  1156. X    "ELSE",        token(ELSE),
  1157. X    "ENDC",        token(ENDCASE),
  1158. X    "ENDCASE",    token(ENDCASE),
  1159. X    "ENDD",        token(ENDDO),
  1160. X    "ENDDO",    token(ENDDO),
  1161. X    "ENDI",        token(ENDIF),
  1162. X    "ENDIF",    token(ENDIF),
  1163. X    "ENDTEXT",    token(ENDTEXT),
  1164. X    "ERASE",    token(ERASE),
  1165. X    "EXCL",        token(EXCLUSIVE),
  1166. X    "EXCLUSIVE",    token(EXCLUSIVE),
  1167. X    "EXIT",        token(EXIT),
  1168. X    "EXPO",        token(EXPORT),
  1169. X    "EXPORT",    token(EXPORT),
  1170. X    "FIEL",        token(FIELDS),
  1171. X    "FIELDS",    token(FIELDS),
  1172. X    "FILE",        token(FILE_T),
  1173. X    "FIND",        token(FIND),
  1174. X    "FOR",        token(FOR),
  1175. X    "FORM",        token(FORM),
  1176. X    "FROM",        token(FROM),
  1177. X    "GET",        token(GET),
  1178. X    "GO",        token(GO),
  1179. X    "GOTO",        token(GO),
  1180. X    "HEAD",        token(HEADING),
  1181. X    "HEADING",    token(HEADING),
  1182. X    "HELP",        token(HELP),
  1183. X    "IF",        token(IF),
  1184. X    "INDE",        token(INDEX),
  1185. X    "INDEX",    token(INDEX),
  1186. X    "INPU",        token(INPUT),
  1187. X    "INPUT",    token(INPUT),
  1188. X    "INSE",        token(INSERT),
  1189. X    "INSERT",    token(INSERT),
  1190. X    "JOIN",        token(JOIN),
  1191. X    "LABE",        token(LABEL),
  1192. X    "LABEL",    token(LABEL),
  1193. X    "LIST",        token(LIST),
  1194. X    "LOAD",        token(LOAD),
  1195. X    "LOCA",        token(LOCATE),
  1196. X    "LOCATE",    token(LOCATE),
  1197. X    "LOCK",        token(LOCK),
  1198. X    "LOGO",        token(LOGOUT),
  1199. X    "LOGOUT",    token(LOGOUT),
  1200. X    "LOOP",        token(LOOP),
  1201. X    "MENU",        token(MENU),
  1202. X    "MODI",        token(MODIFY),
  1203. X    "MODIFY",    token(MODIFY),
  1204. X    "NEXT",        token(NEXT),
  1205. X    "NOEJ",        token(NOEJECT),
  1206. X    "NOEJECT",    token(NOEJECT),
  1207. X    "NOTE",        token(NOTE),
  1208. X    "OFF",        token(OFF),
  1209. X    "ON",        token(ON),
  1210. X    "OTHE",        token(OTHERWISE),
  1211. X    "OTHERWISE",    token(OTHERWISE),
  1212. X    "PACK",        token(PACK),
  1213. X    "PARA",        token(PARAMETERS),
  1214. X    "PARAMETERS",    token(PARAMETERS),
  1215. X    "PICT",        token(PICTURE),
  1216. X    "PICTURE",    token(PICTURE),
  1217. X    "PLAIN",    token(PLAIN),
  1218. X    "PLAI",        token(PLAIN),
  1219. X    "PRIN",        token(PRINT),
  1220. X    "PRINT",    token(PRINT),
  1221. X    "PRIV",        token(PRIVATE),
  1222. X    "PRIVATE",    token(PRIVATE),
  1223. X    "PROC",        token(PROCEDURE),
  1224. X    "PROCEDURE",    token(PROCEDURE),
  1225. X    "PROM",        token(PROMPT),
  1226. X    "PROMPT",    token(PROMPT),
  1227. X    "PUBL",        token(PUBLIC),
  1228. X    "PUBLIC",    token(PUBLIC),
  1229. X    "QUIT",        token(QUIT),
  1230. X    "RANGE",    token(RANGE),
  1231. X    "READ",        token(READ),
  1232. X    "RECA",        token(RECALL),
  1233. X    "RECALL",    token(RECALL),
  1234. X    "RECO",        token(RECORD),
  1235. X    "RECORD",    token(RECORD),
  1236. X    "REIN",        token(REINDEX),
  1237. X    "REINDEX",    token(REINDEX),
  1238. X    "RELE",        token(RELEASE),
  1239. X    "RELEASE",    token(RELEASE),
  1240. X    "RENA",        token(RENAME),
  1241. X    "RENAME",    token(RENAME),
  1242. X    "REPL",        token(REPLACE),
  1243. X    "REPLACE",    token(REPLACE),
  1244. X    "REPO",        token(REPORT),
  1245. X    "REPORT",    token(REPORT),
  1246. X    "RESTORE",    token(RESTORE),
  1247. X    "REST",        token(REST),
  1248. X    "RESU",        token(RESUME),
  1249. X    "RESUME",    token(RESUME),
  1250. X    "RETR",        token(RETRY),
  1251. X    "RETRY",    token(RETRY),
  1252. X    "RETU",        token(RETURN),
  1253. X    "RETURN",    token(RETURN),
  1254. X    "RUN",        token(RUN),
  1255. X    "SAY",        token(SAY),
  1256. X    "SEEK",        token(SEEK),
  1257. X    "SELE",        token(SELECT),
  1258. X    "SELECT",    token(SELECT),
  1259. X    "SET",        token(SET),
  1260. X    "SKIP",        token(SKIP),
  1261. X    "SORT",        token(SORT),
  1262. X    "STORE",    token(STORE),
  1263. X    "STRU",        token(STRUCTURE),
  1264. X    "STRUCTURE",    token(STRUCTURE),
  1265. X    "SUM",        token(SUM),
  1266. X    "SUMM",        token(SUMMARY),
  1267. X    "SUMMARY",    token(SUMMARY),
  1268. X    "SUSP",        token(SUSPEND),
  1269. X    "SUSPEND",    token(SUSPEND),
  1270. X    "TEXT",        token(TEXT),
  1271. X    "TO",        token(TO),
  1272. X    "TOP",        token(TOP),
  1273. X    "TOTAL",    token(TOTAL),
  1274. X    "TYPE",        token(TYPE),
  1275. X    "UNLO",        token(UNLOCK),
  1276. X    "UNLOCK",    token(UNLOCK),
  1277. X    "UNIQ",        token(UNIQUE),
  1278. X    "UNIQUE",    token(UNIQUE),
  1279. X    "USE",        token(USE),
  1280. X    "VIEW",        token(VIEW),
  1281. X    "WAIT",        token(WAIT),
  1282. X    "WHIL",        token(WHILE),
  1283. X    "WHILE",    token(WHILE),
  1284. X    "WITH",        token(WITH),
  1285. X    "ZAP",        token(ZAP),
  1286. X    };
  1287. X
  1288. Xstatic int screen()
  1289. X{
  1290. X    struct rwtable    *low = rwtable,
  1291. X            *high = END_OF(rwtable),
  1292. X            *mid;
  1293. X    register char    *yptr, *op, ochar[100];
  1294. X    int c;
  1295. X
  1296. X    op = ochar;
  1297. X    for (yptr = yytext; *yptr; yptr++)
  1298. X        *op++ = toupper(*yptr);
  1299. X    *op = 0;
  1300. X    op = ochar;
  1301. X    while (low <= high) {
  1302. X        mid = low + (high - low)/2;
  1303. X        if ((c = strcmp(mid->rw_name, op)) == 0)
  1304. X            return mid->rw_yylex;
  1305. X        else if (c < 0)
  1306. X            low = mid + 1;
  1307. X        else
  1308. X            high = mid - 1;
  1309. X    }
  1310. X    s_lookup(token(Identifier));
  1311. X    return token(Identifier);
  1312. X}
  1313. END_OF_FILE
  1314. if test 7070 -ne `wc -c <'token.l'`; then
  1315.     echo shar: \"'token.l'\" unpacked with wrong size!
  1316. fi
  1317. # end of 'token.l'
  1318. fi
  1319. if test -f 'gram.y' -a "${1}" != "-c" ; then 
  1320.   echo shar: Will not clobber existing file \"'gram.y'\"
  1321. else
  1322. echo shar: Extracting \"'gram.y'\" \(7776 characters\)
  1323. sed "s/^X//" >'gram.y' <<'END_OF_FILE'
  1324. X/*
  1325. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  1326. X *              (Music, Intuition, Software, and Computers)
  1327. X * All Rights Reserved
  1328. X */
  1329. X
  1330. X%token    L_PAREN
  1331. X%token    R_PAREN
  1332. X%token    AT
  1333. X%token    QUEST
  1334. X%token    AMPER
  1335. X%token    CR
  1336. X
  1337. X%token    PLUS
  1338. X%token    MINUS
  1339. X
  1340. X%token    MULT
  1341. X%token    DIVIDE
  1342. X
  1343. X%token    COMMA
  1344. X%token    COLON
  1345. X%token    BANG
  1346. X
  1347. X%token    EQUAL
  1348. X%token    NOT_EQUAL
  1349. X%token    GREATER
  1350. X%token    GREATER_EQUAL
  1351. X%token    LESS
  1352. X%token    LESS_EQUAL
  1353. X%token    DOLLAR
  1354. X%token    PTR
  1355. X%token    PERIOD
  1356. X
  1357. X%token    OR
  1358. X%token    AND
  1359. X%token    NOT
  1360. X
  1361. X%token    STRING
  1362. X%token    Identifier
  1363. X%token    Constant
  1364. X
  1365. X%token    ACCEPT
  1366. X%token    ALIAS
  1367. X%token    ALL
  1368. X%token    APPEND
  1369. X%token    ASSIST
  1370. X%token    AVERAGE
  1371. X%token    BLANK
  1372. X%token    BOTTOM
  1373. X%token    BROWSE
  1374. X%token    CALL
  1375. X%token    CANCEL
  1376. X%token    CASE
  1377. X%token    CHANGE
  1378. X%token    CLEAR
  1379. X%token    CLOSE
  1380. X%token    CONTINUE
  1381. X%token    COPY
  1382. X%token    COUNT
  1383. X%token    DATABASES
  1384. X%token    DELETE
  1385. X%token    DELIMITED
  1386. X%token    DISPLAY
  1387. X%token    DO
  1388. X%token    EDIT
  1389. X%token    EJECT
  1390. X%token    ELSE
  1391. X%token    ENDCASE
  1392. X%token    ENDDO
  1393. X%token    ENDIF
  1394. X%token    ENDTEXT
  1395. X%token    ERASE
  1396. X%token    EXCLUSIVE
  1397. X%token    EXIT
  1398. X%token    EXPORT
  1399. X%token    FIELDS
  1400. X%token    FILE_T
  1401. X%token    FIND
  1402. X%token    FOR
  1403. X%token    FORM
  1404. X%token    FROM
  1405. X%token    GET
  1406. X%token    GO
  1407. X%token    HELP
  1408. X%token    HEADING
  1409. X%token    IF
  1410. X%token    INDEX
  1411. X%token    INPUT
  1412. X%token    INSERT
  1413. X%token    JOIN
  1414. X%token    LABEL
  1415. X%token    LIST
  1416. X%token    LOAD
  1417. X%token    LOCATE
  1418. X%token    LOCK
  1419. X%token    LOGOUT
  1420. X%token    LOOP
  1421. X%token    MENU
  1422. X%token    MODIFY
  1423. X%token    NEXT
  1424. X%token    NOEJECT
  1425. X%token    NOTE
  1426. X%token    OFF
  1427. X%token    ON
  1428. X%token    OTHERWISE
  1429. X%token    PACK
  1430. X%token    PARAMETERS
  1431. X%token    PICTURE
  1432. X%token    PLAIN
  1433. X%token    PRINT
  1434. X%token    PRIVATE
  1435. X%token    PROMPT
  1436. X%token    PROCEDURE
  1437. X%token    PUBLIC
  1438. X%token    QUIT
  1439. X%token    RANGE
  1440. X%token    READ
  1441. X%token    RECALL
  1442. X%token    RECORD
  1443. X%token    REINDEX
  1444. X%token    RELEASE
  1445. X%token    RENAME
  1446. X%token    REPLACE
  1447. X%token    REPORT
  1448. X%token    RESTORE
  1449. X%token    REST
  1450. X%token    RESUME
  1451. X%token    RETRY
  1452. X%token    RETURN
  1453. X%token    RUN
  1454. X%token    SAY
  1455. X%token    SEEK
  1456. X%token    SELECT
  1457. X%token    SET
  1458. X%token    SKIP
  1459. X%token    SORT
  1460. X%token    STORE
  1461. X%token    STRUCTURE
  1462. X%token    SUM
  1463. X%token    SUMMARY
  1464. X%token    SUSPEND
  1465. X%token    TEXT
  1466. X%token    TO
  1467. X%token    TOP
  1468. X%token    TOTAL
  1469. X%token    TYPE
  1470. X%token    UNLOCK
  1471. X%token    UNIQUE
  1472. X%token    USE
  1473. X%token    VIEW
  1474. X%token    WAIT
  1475. X%token    WHILE
  1476. X%token    WITH
  1477. X%token    ZAP
  1478. X
  1479. X%left    NOT_EQUAL LESS LESS_EQUAL GREATER GREATER_EQUAL
  1480. X%left    AND OR NOT
  1481. X%left    PLUS MINUS
  1482. X%left    MULT DIVIDE
  1483. X%left    EQUAL
  1484. X
  1485. X%%
  1486. X
  1487. Xfile
  1488. X    : statements
  1489. X
  1490. Xstatements
  1491. X    :        /* NULL */
  1492. X    | statements statement
  1493. X
  1494. Xstatement
  1495. X    : CR
  1496. X    | set_statement CR
  1497. X    | do_statement CR
  1498. X    | at_statement CR
  1499. X    | store_statement CR
  1500. X    | clear_statement CR
  1501. X    | quest_statement CR
  1502. X    | go_statement CR
  1503. X    | replace_statement CR
  1504. X    | if_statement CR
  1505. X    | use_statement CR
  1506. X    | count_statement CR
  1507. X    | skip_statement CR
  1508. X    | index_statement CR
  1509. X    | append_statement CR
  1510. X    | recall_statement CR
  1511. X    | delete_statement CR
  1512. X    | assign_statement CR
  1513. X    | proc_statement CR
  1514. X    | select_statement CR
  1515. X    | find_statement CR
  1516. X    | copy_statement CR
  1517. X    | report_statement CR
  1518. X    | wait_statement CR
  1519. X    | close_statement CR
  1520. X    | erase_statement CR
  1521. X    | simple_statement CR
  1522. X
  1523. Xset_statement
  1524. X    : SET Identifier set_list
  1525. X    | SET spec_ident set_list
  1526. X    | SET INDEX TO ident_list
  1527. X    | SET VIEW TO ident_list
  1528. X
  1529. Xset_list
  1530. X    : ON
  1531. X    | OFF
  1532. X    | TO Identifier
  1533. X    | TO spec_ident
  1534. X    | TO Constant
  1535. X
  1536. Xdo_statement
  1537. X    : DO WHILE expression statements ENDDO
  1538. X    | DO CASE cases ENDCASE
  1539. X    | DO Identifier
  1540. X
  1541. Xcases
  1542. X    : case
  1543. X    | case cases
  1544. X
  1545. Xcase
  1546. X    : CR
  1547. X    | CASE expression statements
  1548. X    | OTHERWISE statements
  1549. X
  1550. Xat_statement
  1551. X    : AT expression COMMA expression at_extras
  1552. X
  1553. Xat_extras
  1554. X    : at_extra
  1555. X    | at_extras at_extra
  1556. X
  1557. Xat_extra
  1558. X    : SAY expression
  1559. X    | SAY expression PICTURE STRING
  1560. X    | GET ident_or_ref
  1561. X    | GET ident_or_ref get_stuff
  1562. X    | GET spec_ident
  1563. X    | GET spec_ident get_stuff
  1564. X    | CLEAR
  1565. X
  1566. Xget_stuff
  1567. X    : PICTURE STRING
  1568. X    | RANGE expression COMMA expression
  1569. X
  1570. Xstore_statement
  1571. X    : STORE expression TO ident_or_ref
  1572. X    | STORE expression TO spec_ident
  1573. X
  1574. Xwait_statement
  1575. X    : WAIT STRING
  1576. X    | WAIT STRING TO ident_or_ref
  1577. X    | WAIT STRING TO spec_ident
  1578. X
  1579. Xclear_statement
  1580. X    : CLEAR
  1581. X    | CLEAR ALL
  1582. X    | CLEAR Identifier
  1583. X
  1584. Xcopy_statement
  1585. X    : COPY TO ident_or_ref copy_list
  1586. X    | COPY TO ident_or_ref STRUCTURE
  1587. X    | COPY ident_or_ref TO ident_or_ref
  1588. X
  1589. Xcopy_list
  1590. X    :             /* blank is ok */
  1591. X    | copy_list scope
  1592. X    | copy_list FIELDS ident_list
  1593. X    | copy_list FOR expression
  1594. X    | copy_list WHILE expression
  1595. X
  1596. Xfind_statement
  1597. X    : FIND ident_or_ref
  1598. X
  1599. Xquest_statement
  1600. X    : QUEST opt_list
  1601. X
  1602. Xgo_statement
  1603. X    : GO ident_or_ref
  1604. X    | GO spec_ident
  1605. X    | GO AMPER spec_ident
  1606. X    | GO BOTTOM
  1607. X    | GO TOP
  1608. X
  1609. Xreplace_statement
  1610. X    : REPLACE repl_list repl_cond
  1611. X    | REPLACE scope repl_list repl_cond
  1612. X
  1613. Xrepl_cond
  1614. X    :            /* blank coditions ok */
  1615. X    | FOR expression repl_cond
  1616. X    | WHILE expression repl_cond
  1617. X
  1618. Xif_statement
  1619. X    : IF expression statements ENDIF
  1620. X    | IF expression statements ELSE statements ENDIF
  1621. X
  1622. Xuse_statement
  1623. X    : USE use_list
  1624. X    | USE ident_or_ref use_list
  1625. X
  1626. Xuse_list
  1627. X    :            /* blank line is valid */
  1628. X    | use_list INDEX ident_list
  1629. X    | use_list ALIAS Identifier
  1630. X    | use_list EXCLUSIVE
  1631. X
  1632. Xcount_statement
  1633. X    : COUNT count_list
  1634. X
  1635. Xcount_list
  1636. X    :
  1637. X    | scope count_list
  1638. X    | FOR expression count_list
  1639. X    | WHILE expression count_list
  1640. X    | TO Identifier
  1641. X
  1642. Xident_list
  1643. X    : ident_or_ref
  1644. X    | spec_ident
  1645. X    | AMPER spec_ident
  1646. X    | ident_list COMMA ident_or_ref
  1647. X
  1648. Xskip_statement
  1649. X    : SKIP
  1650. X    | SKIP expression
  1651. X
  1652. Xindex_statement
  1653. X    : INDEX ON expression TO ident_or_ref
  1654. X    | INDEX ON expression TO ident_or_ref UNIQUE
  1655. X
  1656. Xappend_statement
  1657. X    : APPEND append_list
  1658. X
  1659. Xappend_list
  1660. X    :        /* blank is reasonable */
  1661. X    | BLANK
  1662. X    | FROM Identifier from_extras
  1663. X
  1664. Xfrom_extras
  1665. X    :        /* from not reqired */
  1666. X    | FOR expression
  1667. X    | TYPE DELIMITED from_type
  1668. X
  1669. Xfrom_type
  1670. X    :        /* not required */
  1671. X    | WITH STRING
  1672. X    | WITH BLANK
  1673. X    | Identifier
  1674. X
  1675. Xrecall_statement
  1676. X    : RECALL recall_extras
  1677. X
  1678. Xrecall_extras
  1679. X    :        /* can be blank */
  1680. X    | scope recall_extras
  1681. X    | FOR expression recall_extras
  1682. X    | WHILE expression recall_extras
  1683. X
  1684. Xdelete_statement
  1685. X    : DELETE recall_extras
  1686. X    | DELETE FILE_T ident_or_ref
  1687. X
  1688. Xassign_statement
  1689. X    : Identifier EQUAL expression
  1690. X
  1691. Xproc_statement
  1692. X    : PROCEDURE Identifier
  1693. X
  1694. Xreport_statement
  1695. X    : REPORT FORM Identifier rep_list
  1696. X    | REPORT FORM spec_ident rep_list
  1697. X    | REPORT FORM AMPER spec_ident rep_list
  1698. X
  1699. Xrep_list
  1700. X    :            /* blank is ok */
  1701. X    | rep_list scope
  1702. X    | rep_list FOR expression
  1703. X    | rep_list WHILE expression
  1704. X    | rep_list NOEJECT
  1705. X    | rep_list PLAIN
  1706. X    | rep_list SUMMARY
  1707. X    | rep_list HEADING expression
  1708. X    | rep_list TO PRINT
  1709. X    | rep_list TO FILE_T Identifier
  1710. X
  1711. Xsimple_statement
  1712. X    : CANCEL
  1713. X    | EJECT
  1714. X    | LOOP
  1715. X    | PACK
  1716. X    | READ
  1717. X    | REINDEX
  1718. X    | RETURN
  1719. X    | SEEK expression
  1720. X
  1721. Xclose_statement
  1722. X    : CLOSE ALL
  1723. X    | CLOSE DATABASES
  1724. X
  1725. Xerase_statement
  1726. X    : ERASE file_name
  1727. X
  1728. Xfile_name
  1729. X    : Identifier
  1730. X    | Identifier PERIOD Identifier
  1731. X
  1732. Xrepl_list
  1733. X    : ident_or_ref WITH expression
  1734. X    | repl_list COMMA ident_or_ref WITH expression
  1735. X
  1736. Xscope
  1737. X    : ALL
  1738. X    | NEXT expression
  1739. X    | RECORD expression
  1740. X    | REST
  1741. X
  1742. Xselect_statement
  1743. X    : SELECT Identifier
  1744. X    | SELECT Constant
  1745. X
  1746. Xspec_ident
  1747. X    : BLANK
  1748. X    | COUNT
  1749. X    | DELETE
  1750. X    | TOTAL
  1751. X    | COPY
  1752. X    | INDEX
  1753. X    | REPORT
  1754. X    | HEADING
  1755. X    | PRINT
  1756. X    | RECORD
  1757. X    | AMPER RECORD
  1758. X
  1759. Xident_or_ref
  1760. X    : Identifier
  1761. X    | AMPER Identifier
  1762. X    | ident_or_ref PTR Identifier
  1763. X    | ident_or_ref PERIOD Identifier
  1764. X
  1765. Xexpression
  1766. X    : Constant
  1767. X    | ident_or_ref
  1768. X    | spec_ident
  1769. X    | STRING
  1770. X    | STRING DOLLAR ident_or_ref
  1771. X    | L_PAREN expression R_PAREN
  1772. X    | Identifier L_PAREN opt_list R_PAREN
  1773. X    | spec_ident L_PAREN opt_list R_PAREN
  1774. X    | MINUS expression
  1775. X    | PLUS expression
  1776. X    | NOT expression
  1777. X    | expression PLUS expression        %prec PLUS
  1778. X    | expression MINUS expression        %prec PLUS
  1779. X    | expression MULT expression        %prec MULT
  1780. X    | expression DIVIDE expression        %prec MULT
  1781. X    | expression AND expression        %prec AND
  1782. X    | expression OR expression        %prec AND
  1783. X    | expression EQUAL expression        %prec EQUAL
  1784. X    | expression NOT_EQUAL expression    %prec NOT_EQUAL
  1785. X    | expression GREATER expression        %prec NOT_EQUAL
  1786. X    | expression GREATER_EQUAL expression    %prec NOT_EQUAL
  1787. X    | expression LESS expression        %prec NOT_EQUAL
  1788. X    | expression LESS_EQUAL expression    %prec NOT_EQUAL
  1789. X
  1790. Xopt_list
  1791. X    :        /* no actual args */
  1792. X    | arg_list
  1793. X
  1794. Xarg_list
  1795. X    : expression
  1796. X    | arg_list COMMA expression
  1797. X
  1798. X%%
  1799. X
  1800. Xmain()
  1801. X{
  1802. X    int    yyret;
  1803. X#ifdef YYDEBUG
  1804. X    extern int yydebug;
  1805. X
  1806. X    yydebug = 1;
  1807. X#endif
  1808. X    yyret = yyparse();
  1809. X    printf("yyparse() == %d\n", yyret);
  1810. X    exit(yyret);
  1811. X}
  1812. END_OF_FILE
  1813. if test 7776 -ne `wc -c <'gram.y'`; then
  1814.     echo shar: \"'gram.y'\" unpacked with wrong size!
  1815. fi
  1816. # end of 'gram.y'
  1817. fi
  1818. if test -f 'dbinter.c' -a "${1}" != "-c" ; then 
  1819.   echo shar: Will not clobber existing file \"'dbinter.c'\"
  1820. else
  1821. echo shar: Extracting \"'dbinter.c'\" \(995 characters\)
  1822. sed "s/^X//" >'dbinter.c' <<'END_OF_FILE'
  1823. X/*
  1824. X * Copyright (c) 1991, 1992 Brad Eacker,
  1825. X *              (Music, Intuition, Software, and Computers)
  1826. X * All Rights Reserved
  1827. X */
  1828. X
  1829. X#include <stdio.h>
  1830. X#include "dbf_sym.h"
  1831. X
  1832. Xchar *strsave();
  1833. X
  1834. Xstruct sym_def sym_tab[100];
  1835. Xint    sym_len = 0;
  1836. X
  1837. Xchar *
  1838. Xs_lookup(yylex)
  1839. Xint    yylex;        /* Constant or Identifier */
  1840. X{
  1841. X    extern YYSTYPE yylval;
  1842. X    extern char yytext[];
  1843. X    extern char *strsave();
  1844. X    register struct sym_def *low = sym_tab,
  1845. X                *high = &sym_tab[sym_len],
  1846. X                *mid;
  1847. X    int c;
  1848. X
  1849. X    if (sym_len > 0) {
  1850. X        while (low <= high) {
  1851. X            mid = low + (high - low)/2;
  1852. X            if ((c = strcmp(mid->sig_name, yytext)) == 0)
  1853. X                return mid->sig_name;
  1854. X            else if (c < 0)
  1855. X                low = mid + 1;
  1856. X            else
  1857. X                high = mid - 1;
  1858. X        }
  1859. X    } else {
  1860. X        mid = sym_tab;
  1861. X    }
  1862. X    for (high = &sym_tab[sym_len]; high >= mid; high--) {
  1863. X        high[1] = high[0];
  1864. X    }
  1865. X    mid->sig_name = strsave(yytext);
  1866. X    yylval = mid->sig_name;
  1867. X}
  1868. X
  1869. Xchar *
  1870. Xstrsave(cp)
  1871. Xchar *cp;
  1872. X{
  1873. X    int len;
  1874. X    char *np;
  1875. X
  1876. X    len = strlen(cp);
  1877. X    if (np = (char *)malloc(len+1))
  1878. X        strcpy(np, cp);
  1879. X    return np;
  1880. X}
  1881. END_OF_FILE
  1882. if test 995 -ne `wc -c <'dbinter.c'`; then
  1883.     echo shar: \"'dbinter.c'\" unpacked with wrong size!
  1884. fi
  1885. # end of 'dbinter.c'
  1886. fi
  1887. if test -f 'dbf_sym.h' -a "${1}" != "-c" ; then 
  1888.   echo shar: Will not clobber existing file \"'dbf_sym.h'\"
  1889. else
  1890. echo shar: Extracting \"'dbf_sym.h'\" \(207 characters\)
  1891. sed "s/^X//" >'dbf_sym.h' <<'END_OF_FILE'
  1892. X/*
  1893. X * Copyright (c) 1991, 1992 Brad Eacker,
  1894. X *              (Music, Intuition, Software, and Computers)
  1895. X * All Rights Reserved
  1896. X */
  1897. X
  1898. X#define    YYSTYPE    char *
  1899. X
  1900. Xstruct sym_def {
  1901. X    char    *sig_name;
  1902. X    int    sig_num;
  1903. X};
  1904. END_OF_FILE
  1905. if test 207 -ne `wc -c <'dbf_sym.h'`; then
  1906.     echo shar: \"'dbf_sym.h'\" unpacked with wrong size!
  1907. fi
  1908. # end of 'dbf_sym.h'
  1909. fi
  1910. if test -f 'yyerr.c' -a "${1}" != "-c" ; then 
  1911.   echo shar: Will not clobber existing file \"'yyerr.c'\"
  1912. else
  1913. echo shar: Extracting \"'yyerr.c'\" \(1472 characters\)
  1914. sed "s/^X//" >'yyerr.c' <<'END_OF_FILE'
  1915. X/*
  1916. X * Copyright (c) 1991, 1992 Brad Eacker,
  1917. X *              (Music, Intuition, Software, and Computers)
  1918. X * All Rights Reserved
  1919. X */
  1920. X
  1921. X#include <stdio.h>
  1922. X
  1923. XFILE *yyerfp = stdout;        /* error stream */
  1924. X
  1925. Xextern char yytext[];        /* current token */
  1926. Xextern int yyleng;        /* and it's length */
  1927. Xextern yylineno;        /* current input line number */
  1928. X
  1929. Xstatic char *source;        /* current input line number */
  1930. X
  1931. Xyywhere()
  1932. X{
  1933. X    char colon = 0;        /* a flag */
  1934. X
  1935. X    if (source && *source && strcmp(source, "\"\"")) {
  1936. X        char *cp = source;
  1937. X        int len = strlen(source);
  1938. X
  1939. X        if (*cp == '"')
  1940. X            ++cp, len -= 2;
  1941. X        if (strncmp(cp, "./",2) == 0)
  1942. X            cp += 2, len -= 2;
  1943. X        fprintf(yyerfp, "file %.*s", len, cp);
  1944. X        colon = 1;
  1945. X    }
  1946. X    if (yylineno > 0) {
  1947. X        if (colon)
  1948. X            fputs(", ", yyerfp);
  1949. X        fprintf(yyerfp, "line %d",
  1950. X            yylineno - (*yytext == '\n' || ! *yytext));
  1951. X        colon = 1;
  1952. X    }
  1953. X    if (*yytext) {
  1954. X        register int i;
  1955. X
  1956. X        for (i = 0; i < 20; ++i)
  1957. X            if (!yytext[i] || yytext[i] == '\n')
  1958. X                break;
  1959. X        if (i) {
  1960. X            if (colon)
  1961. X                putc(' ', yyerfp);
  1962. X            fprintf(yyerfp, "near \"%.*s\"", i, yytext);
  1963. X            colon = 1;
  1964. X        }
  1965. X    }
  1966. X    if (colon)
  1967. X        fputs(": ", yyerfp);
  1968. X}
  1969. X
  1970. Xyymark()        /* retrieve from '# digits text' */
  1971. X{
  1972. X    if (source)
  1973. X        cfree(source);
  1974. X    source = (char *) calloc(yyleng, sizeof(char));
  1975. X    if (source)
  1976. X        sscanf(yytext, "# %d %s", &yylineno, source);
  1977. X}
  1978. X
  1979. Xyyerror(s)
  1980. Xregister char *s;
  1981. X{
  1982. X    extern int yynerrs;    /* total number off errs */
  1983. X
  1984. X    fprintf(yyerfp, "[error %d] ", yynerrs + 1);
  1985. X    yywhere();
  1986. X    fputs(s, yyerfp);
  1987. X    putc('\n', yyerfp);
  1988. X}
  1989. X
  1990. END_OF_FILE
  1991. if test 1472 -ne `wc -c <'yyerr.c'`; then
  1992.     echo shar: \"'yyerr.c'\" unpacked with wrong size!
  1993. fi
  1994. # end of 'yyerr.c'
  1995. fi
  1996. if test -f 'tmpl.c' -a "${1}" != "-c" ; then 
  1997.   echo shar: Will not clobber existing file \"'tmpl.c'\"
  1998. else
  1999. echo shar: Extracting \"'tmpl.c'\" \(1349 characters\)
  2000. sed "s/^X//" >'tmpl.c' <<'END_OF_FILE'
  2001. X/*
  2002. X * Copyright (c) 1993 Brad Eacker,
  2003. X *              (Music, Intuition, Software, and Computers)
  2004. X * All Rights Reserved
  2005. X */
  2006. X
  2007. X/*
  2008. X * build the template file for creating databases
  2009. X */
  2010. X#include <stdio.h>
  2011. X#include <fcntl.h>
  2012. X
  2013. X#include "dbf.h"
  2014. X
  2015. X#define    TEMPL_FILE    "tmpl.dbf"
  2016. X#define    OPEN_FLAGS    (O_RDWR | O_CREAT | O_TRUNC)
  2017. X
  2018. Xstruct db_field creat_f[] = {
  2019. X    {"FIELD_NAME", 'C', 10, 0, NULL,  1},
  2020. X    {"FIELD_TYPE", 'C',  1, 0, NULL, 11},
  2021. X    {"FIELD_LEN",  'N',  3, 0, NULL, 12},
  2022. X    {"FIELD_DEC",  'N',  4, 0, NULL, 15},
  2023. X};
  2024. X
  2025. Xstruct db_head creat_h = {
  2026. X    0, DBH_TYPE_NORMAL, '1','9','9','3','0','8','0','5',
  2027. X    0, 0, 0, 18+1, 4, creat_f
  2028. X};
  2029. X
  2030. Xmain(argc, argv)
  2031. Xint    argc;
  2032. Xchar    **argv;
  2033. X{
  2034. X    dbhead_t     *dbh = &creat_h;
  2035. X    dbfield_t    *dbf, *cur_f;
  2036. X    int        fd, ret, nfields;
  2037. X    unsigned char    *cp;
  2038. X
  2039. X    if ((fd = open(TEMPL_FILE, OPEN_FLAGS, 0644)) < 0) {
  2040. X        perror("open");
  2041. X        exit(1);
  2042. X    }
  2043. X
  2044. X    nfields = dbh->db_nfields;
  2045. X    printf("# fields: %d, record len: %d\n", nfields, dbh->db_rlen);
  2046. X
  2047. X    /* step thru the field info */
  2048. X    dbf = dbh->db_fields;
  2049. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  2050. X        printf("  %s, %c, %d\n", cur_f->db_fname, cur_f->db_type,
  2051. X            cur_f->db_flen);
  2052. X    }
  2053. X
  2054. X    dbh->db_fd = fd;
  2055. X    dbh->db_hlen = sizeof(struct dbf_dhead) + 2 +
  2056. X            dbh->db_nfields * sizeof(struct dbf_dfield);
  2057. X
  2058. X    if (cp = db_cur_date(NULL)) {
  2059. X        strncpy(dbh->db_date, cp, 8);
  2060. X    }
  2061. X
  2062. X    put_dbf_info(dbh);
  2063. X    exit(0);
  2064. X}
  2065. END_OF_FILE
  2066. if test 1349 -ne `wc -c <'tmpl.c'`; then
  2067.     echo shar: \"'tmpl.c'\" unpacked with wrong size!
  2068. fi
  2069. # end of 'tmpl.c'
  2070. fi
  2071. if test -f 'dbfadd.c' -a "${1}" != "-c" ; then 
  2072.   echo shar: Will not clobber existing file \"'dbfadd.c'\"
  2073. else
  2074. echo shar: Extracting \"'dbfadd.c'\" \(1458 characters\)
  2075. sed "s/^X//" >'dbfadd.c' <<'END_OF_FILE'
  2076. X/*
  2077. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  2078. X *              (Music, Intuition, Software, and Computers)
  2079. X * All Rights Reserved
  2080. X */
  2081. X
  2082. X#define    USAGE    "usage: dbfadd <file> <field> <field> ...\n"
  2083. X
  2084. X/*
  2085. X * display the database in question to the stdout
  2086. X */
  2087. X#include <stdio.h>
  2088. X#include <fcntl.h>
  2089. X
  2090. X#include "dbf.h"
  2091. X
  2092. Xmain(argc, argv)
  2093. Xint    argc;
  2094. Xchar    **argv;
  2095. X{
  2096. X    dbhead_t     *dbh;
  2097. X    dbfield_t    *dbf, *cur_f;
  2098. X    char    *fnp;
  2099. X    u_char    *cp, *t_cp;
  2100. X    int    fd, nfields;
  2101. X    int    rec_cnt;
  2102. X
  2103. X    if (argc < 2) {
  2104. X        printf(USAGE);
  2105. X        exit(1);
  2106. X    }
  2107. X    argv++;    argc--;
  2108. X    if ((fd = open(*argv, O_RDWR)) < 0) {
  2109. X        cp = (u_char *)malloc(256);
  2110. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  2111. X        free(cp);
  2112. X        if ((fd = open(cp, O_RDWR)) < 0) {
  2113. X            perror("open");
  2114. X            exit(1);
  2115. X        }
  2116. X    }
  2117. X    argv++;    argc--;
  2118. X
  2119. X    if ((dbh = get_dbf_head(fd)) ==     0) {
  2120. X        fprintf(stderr, "Unable to get header\n");
  2121. X        exit(1);
  2122. X    }
  2123. X
  2124. X    nfields = dbh->db_nfields;
  2125. X    if (nfields != argc) {
  2126. X        fprintf(stderr, "mismatch of field count, %d vs %d inputs\n",
  2127. X                nfields, argc);
  2128. X        exit(1);
  2129. X    }
  2130. X    cp = t_cp = (u_char *)malloc(dbh->db_rlen + 1);
  2131. X    *t_cp++ = VALID_RECORD;
  2132. X
  2133. X    dbf = dbh->db_fields;
  2134. X    for (cur_f = dbf; cur_f < &dbf[nfields]; cur_f++, argv++) {
  2135. X        sprintf(t_cp, cur_f->db_format, *argv);
  2136. X        t_cp += cur_f->db_flen;
  2137. X    }
  2138. X    dbh->db_records++;
  2139. X    if ( put_dbf_record(dbh, dbh->db_records, cp) < 0 ) {
  2140. X        fprintf(stderr, "unable to put record at %d\n",
  2141. X                dbh->db_records);
  2142. X    }
  2143. X    if (cp = db_cur_date(NULL)) {
  2144. X        strncpy(dbh->db_date, cp, 8);
  2145. X    }
  2146. X    put_dbf_info(dbh);
  2147. X}
  2148. END_OF_FILE
  2149. if test 1458 -ne `wc -c <'dbfadd.c'`; then
  2150.     echo shar: \"'dbfadd.c'\" unpacked with wrong size!
  2151. fi
  2152. # end of 'dbfadd.c'
  2153. fi
  2154. if test -f 'dbfdel.c' -a "${1}" != "-c" ; then 
  2155.   echo shar: Will not clobber existing file \"'dbfdel.c'\"
  2156. else
  2157. echo shar: Extracting \"'dbfdel.c'\" \(1246 characters\)
  2158. sed "s/^X//" >'dbfdel.c' <<'END_OF_FILE'
  2159. X/*
  2160. X * Copyright (c) 1993 Brad Eacker,
  2161. X *              (Music, Intuition, Software, and Computers)
  2162. X * All Rights Reserved
  2163. X */
  2164. X
  2165. X#define    USAGE    "usage: dbfdel <file> [<record> <record> ...]\n"
  2166. X
  2167. X/*
  2168. X * display the records of the database in question to the stdout
  2169. X */
  2170. X#include <stdio.h>
  2171. X#include <fcntl.h>
  2172. X
  2173. X#include "dbf.h"
  2174. X
  2175. Xmain(argc, argv)
  2176. Xint    argc;
  2177. Xchar    **argv;
  2178. X{
  2179. X    dbhead_t     *dbh;
  2180. X    dbfield_t    *dbf, *cur_f;
  2181. X    char    *fnp;
  2182. X    u_char    *cp, *t_cp;
  2183. X    int    fd, nfields;
  2184. X    int    rec_num;
  2185. X
  2186. X    if (argc < 2) {
  2187. X        printf(USAGE);
  2188. X        exit(1);
  2189. X    }
  2190. X    argv++;    argc--;
  2191. X    if ((fd = open(*argv, O_RDWR)) < 0) {
  2192. X        cp = (u_char *)malloc(256);
  2193. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  2194. X        free(cp);
  2195. X        if ((fd = open(cp, O_RDWR)) < 0) {
  2196. X            perror("open");
  2197. X            exit(1);
  2198. X        }
  2199. X    }
  2200. X    argv++;    argc--;
  2201. X
  2202. X    if ((dbh = get_dbf_head(fd)) ==     0) {
  2203. X        fprintf(stderr, "Unable to get header\n");
  2204. X        exit(1);
  2205. X    }
  2206. X
  2207. X    while (argc-- > 0) {
  2208. X        rec_num = strtol(*argv++, NULL, 0);
  2209. X        if (del_dbf_record(dbh, rec_num) < 0) {
  2210. X            if (rec_num > dbh->db_records) {
  2211. X                fprintf(stderr, "record %d out of bounds\n",
  2212. X                         rec_num);
  2213. X                continue;
  2214. X            } else {
  2215. X                fprintf(stderr, "unable to delete record %d\n",
  2216. X                         rec_num);
  2217. X            }
  2218. X        }
  2219. X    }
  2220. X    if (cp = db_cur_date(NULL)) {
  2221. X        strncpy(dbh->db_date, cp, 8);
  2222. X    }
  2223. X    put_dbf_info(dbh);
  2224. X}
  2225. END_OF_FILE
  2226. if test 1246 -ne `wc -c <'dbfdel.c'`; then
  2227.     echo shar: \"'dbfdel.c'\" unpacked with wrong size!
  2228. fi
  2229. # end of 'dbfdel.c'
  2230. fi
  2231. if test -f 'dbfpack.c' -a "${1}" != "-c" ; then 
  2232.   echo shar: Will not clobber existing file \"'dbfpack.c'\"
  2233. else
  2234. echo shar: Extracting \"'dbfpack.c'\" \(913 characters\)
  2235. sed "s/^X//" >'dbfpack.c' <<'END_OF_FILE'
  2236. X/*
  2237. X * Copyright (c) 1993 Brad Eacker,
  2238. X *              (Music, Intuition, Software, and Computers)
  2239. X * All Rights Reserved
  2240. X */
  2241. X
  2242. X#define    USAGE    "usage: dbfpack <file>\n"
  2243. X
  2244. X/*
  2245. X * display the database in question to the stdout
  2246. X */
  2247. X#include <stdio.h>
  2248. X#include <fcntl.h>
  2249. X
  2250. X#include "dbf.h"
  2251. X
  2252. Xmain(argc, argv)
  2253. Xint    argc;
  2254. Xchar    **argv;
  2255. X{
  2256. X    dbhead_t     *dbh;
  2257. X    dbfield_t    *dbf, *cur_f;
  2258. X    char    *fnp;
  2259. X    u_char    *cp, *t_cp;
  2260. X    int    fd, nfields;
  2261. X    int    rec_num;
  2262. X
  2263. X    if (argc < 2) {
  2264. X        printf(USAGE);
  2265. X        exit(1);
  2266. X    }
  2267. X    argv++;    argc--;
  2268. X    if ((fd = open(*argv, O_RDWR)) < 0) {
  2269. X        cp = (u_char *)malloc(256);
  2270. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  2271. X        free(cp);
  2272. X        if ((fd = open(cp, O_RDWR)) < 0) {
  2273. X            perror("open");
  2274. X            exit(1);
  2275. X        }
  2276. X    }
  2277. X    argv++;    argc--;
  2278. X
  2279. X    if ((dbh = get_dbf_head(fd)) ==     0) {
  2280. X        fprintf(stderr, "Unable to get header\n");
  2281. X        exit(1);
  2282. X    }
  2283. X
  2284. X    pack_dbf(dbh);
  2285. X    if (cp = db_cur_date(NULL)) {
  2286. X        strncpy(dbh->db_date, cp, 8);
  2287. X    }
  2288. X    put_dbf_info(dbh);
  2289. X}
  2290. END_OF_FILE
  2291. if test 913 -ne `wc -c <'dbfpack.c'`; then
  2292.     echo shar: \"'dbfpack.c'\" unpacked with wrong size!
  2293. fi
  2294. # end of 'dbfpack.c'
  2295. fi
  2296. if test -f 'dbfget.c' -a "${1}" != "-c" ; then 
  2297.   echo shar: Will not clobber existing file \"'dbfget.c'\"
  2298. else
  2299. echo shar: Extracting \"'dbfget.c'\" \(2412 characters\)
  2300. sed "s/^X//" >'dbfget.c' <<'END_OF_FILE'
  2301. X/*
  2302. X * Copyright (c) 1993 Brad Eacker,
  2303. X *              (Music, Intuition, Software, and Computers)
  2304. X * All Rights Reserved
  2305. X */
  2306. X
  2307. X/*
  2308. X * display selected records of the database in question to the stdout
  2309. X */
  2310. X#include <stdio.h>
  2311. X#include <fcntl.h>
  2312. X
  2313. X#define    USAGE    "usage: dbfget [-v] <file> [<record> <record>...]\n"
  2314. X
  2315. X#include "dbf.h"
  2316. X
  2317. Xmain(argc, argv)
  2318. Xint    argc;
  2319. Xchar    **argv;
  2320. X{
  2321. X    dbhead_t     *dbh;
  2322. X    dbfield_t    *dbf, *cur_f;
  2323. X    char    *fnp;
  2324. X    u_char    *cp;
  2325. X    int    fd, nfields;
  2326. X    int    rec_cnt, i;
  2327. X    extern int optind;
  2328. X    extern char *optarg;
  2329. X    int    verbose = 0;
  2330. X
  2331. X    if (argc < 2) {
  2332. X        printf(USAGE);
  2333. X        exit(1);
  2334. X    }
  2335. X    while ((i = getopt(argc, argv, "v")) != EOF) {
  2336. X        switch (i) {
  2337. X            case 'v':
  2338. X            verbose++;
  2339. X            break;
  2340. X            default:
  2341. X            printf(USAGE);
  2342. X            exit(1);
  2343. X        }
  2344. X    }
  2345. X    argc -= optind;  argv += optind;
  2346. X    if ((fd = open(*argv, O_RDONLY)) < 0) {
  2347. X        cp = (u_char *)malloc(256);
  2348. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  2349. X        if ((fd = open(cp, O_RDONLY)) < 0) {
  2350. X            perror("open");
  2351. X            exit(1);
  2352. X        }
  2353. X        free(cp);
  2354. X    }
  2355. X    argv++; argc--;
  2356. X
  2357. X    if ((dbh = get_dbf_head(fd)) ==     0) {
  2358. X        fprintf(stderr, "Unable to get header\n");
  2359. X        exit(1);
  2360. X    }
  2361. X
  2362. X    nfields = dbh->db_nfields;
  2363. X    if (verbose)
  2364. X          printf("# fields: %d, record len: %d, total records %d\n",
  2365. X            nfields, dbh->db_rlen, dbh->db_records);
  2366. X
  2367. X    dbf = dbh->db_fields;
  2368. X
  2369. X    if (verbose) {
  2370. X        for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  2371. X            printf("# %s, %c, %d, %d\n", cur_f->db_fname,
  2372. X                cur_f->db_type, cur_f->db_flen, cur_f->db_fdc);
  2373. X        }
  2374. X    }
  2375. X
  2376. X    /* put out the field headings */
  2377. X    printf(" ");
  2378. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  2379. X        fnp = (char *)strdup(cur_f->db_fname);
  2380. X        if (strlen(fnp) > cur_f->db_flen) {
  2381. X            fnp[cur_f->db_flen] = 0;
  2382. X        }
  2383. X        printf(" ");
  2384. X        printf(cur_f->db_format, fnp);
  2385. X        free((char *)fnp);
  2386. X    }
  2387. X    printf("\n");
  2388. X
  2389. X    /* step thru the records */
  2390. X    while (argc-- > 0) {
  2391. X        rec_cnt = strtol(*argv++, NULL, 0);
  2392. X        if ((cp = get_dbf_record(dbh, rec_cnt)) == NULL) {
  2393. X            printf("tried to read bad record %d\n", rec_cnt);
  2394. X            break;
  2395. X        }
  2396. X        out_rec(dbh, dbf, cp);
  2397. X        free(cp);
  2398. X    }
  2399. X}
  2400. X
  2401. X/*
  2402. X * output a record
  2403. X */
  2404. Xout_rec(dbh, dbf, cp)
  2405. Xdbhead_t    *dbh;
  2406. Xdbfield_t    *dbf;
  2407. Xchar    *cp;
  2408. X{
  2409. X    dbfield_t    *cur_f;
  2410. X    int    nfields = dbh->db_nfields;
  2411. X    char    *fnp = (char *)alloca(dbh->db_rlen);
  2412. X
  2413. X    printf("%c", *cp++);
  2414. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++) {
  2415. X        printf(" ");
  2416. X        strncpy(fnp, cp, cur_f->db_flen);
  2417. X        fnp[cur_f->db_flen] = 0;
  2418. X        printf(cur_f->db_format, fnp);
  2419. X        cp += cur_f->db_flen;
  2420. X    }
  2421. X    printf("\n");
  2422. X}
  2423. END_OF_FILE
  2424. if test 2412 -ne `wc -c <'dbfget.c'`; then
  2425.     echo shar: \"'dbfget.c'\" unpacked with wrong size!
  2426. fi
  2427. # end of 'dbfget.c'
  2428. fi
  2429. if test -f 'dbf_ndx.h' -a "${1}" != "-c" ; then 
  2430.   echo shar: Will not clobber existing file \"'dbf_ndx.h'\"
  2431. else
  2432. echo shar: Extracting \"'dbf_ndx.h'\" \(2545 characters\)
  2433. sed "s/^X//" >'dbf_ndx.h' <<'END_OF_FILE'
  2434. X/*
  2435. X * Copyright (c) 1993 Brad Eacker,
  2436. X *              (Music, Intuition, Software, and Computers)
  2437. X * All Rights Reserved
  2438. X */
  2439. X
  2440. X/*
  2441. X * dbf .ndx header structure on disk and in memory
  2442. X *
  2443. X *  Basic info taken from:
  2444. X *    "Clipper Programming Guide, 3rd Edition, Version 5.01"
  2445. X *    by Rick Spence
  2446. X */
  2447. X
  2448. X#ifndef _DBF_NDX_H_
  2449. X#define     _DBF_NDX_H_
  2450. X
  2451. X#include "dbf.h"
  2452. X
  2453. X#define    NDX_PAGE_SZ    512
  2454. X
  2455. X/* on disk ndx header */
  2456. Xstruct dndx_header {
  2457. X    u_char    dndx_st_pg[4];        /* starting page number */
  2458. X    u_char    dndx_tot_pg[4];        /* total number of pages */
  2459. X    u_char    dndx_filler1[4];    /* space */
  2460. X    u_char    dndx_key_len[2];    /* key length */
  2461. X    u_char    dndx_keys_ppg[2];    /* number of keys per page */
  2462. X    u_char    dndx_key_type[2];    /* key type */
  2463. X    u_char    dndx_size_key[4];    /* size of the key record */
  2464. X    u_char    dndx_filler2;        /* space */
  2465. X    u_char    dndx_unique;        /* whether or not done with unique */
  2466. X    u_char    dndx_key_name[488];    /* string defining the key */
  2467. X};
  2468. Xtypedef struct dndx_header dndx_header_t;
  2469. X
  2470. X/* in memory ndx header */
  2471. Xstruct ndx_header {
  2472. X    long    ndx_start_pg;
  2473. X    long    ndx_total_pgs;
  2474. X    unsigned short    ndx_key_len;
  2475. X    unsigned short    ndx_keys_ppg;
  2476. X    unsigned short    ndx_key_type;
  2477. X    u_char    ndx_unique;
  2478. X    long    ndx_key_size;
  2479. X    u_char    *ndx_key_name;
  2480. X    int    ndx_fd;
  2481. X    struct ndx_page    *ndx_fp;
  2482. X    dndx_header_t *ndx_hpage;
  2483. X    struct ndx_record *ndx_cur_rec;
  2484. X};
  2485. Xtypedef struct ndx_header ndx_header_t;
  2486. X
  2487. X/* these are the possible values in the key type field */
  2488. X#define    NDX_CHAR_TYPE    00
  2489. X#define    NDX_NUM_TYPE    01
  2490. X
  2491. X/* on disk key record */
  2492. Xstruct dndx_record {
  2493. X    u_char    dndx_left_pg[4];    /* number of left page */
  2494. X    u_char    dndx_dbf_rec[4];    /* dbf record number */
  2495. X    u_char    dndx_key_data;        /* key data */
  2496. X};
  2497. Xtypedef struct dndx_record dndx_record_t;
  2498. X
  2499. Xstruct ndx_record {
  2500. X    long    ndxr_left;
  2501. X    long    ndxr_rec;
  2502. X    u_char    *ndxr_key_data;
  2503. X    struct ndx_page *ndxr_page;    /* page pointer to where we are from*/
  2504. X    int    ndxr_p_nrec;        /* number of the record within page */
  2505. X};
  2506. Xtypedef struct ndx_record ndx_record_t;
  2507. X
  2508. Xstruct dndx_page {
  2509. X    u_char    dndxp_num_keys[4];    /* number of keys on this page */
  2510. X    struct dndx_record dndx_rp;
  2511. X};
  2512. Xtypedef struct dndx_page dndx_page_t;
  2513. X
  2514. Xstruct ndx_page {
  2515. X    long        ndxp_page_no;
  2516. X    long        ndxp_num_keys;
  2517. X    dndx_page_t    *ndxp_page_data;
  2518. X    ndx_header_t    *ndxp_header_p;
  2519. X    long        ndxp_last_key;
  2520. X    struct ndx_page    *ndxp_parent;    /* parent page */
  2521. X    int        ndxp_par_rno;    /* record number within parent */
  2522. X    struct ndx_record *ndxp_records;
  2523. X};
  2524. Xtypedef struct ndx_page ndx_page_t;
  2525. X
  2526. Xextern ndx_header_t *ndx_get_header();
  2527. X
  2528. Xextern ndx_record_t *ndx_get_first_rec();
  2529. Xextern ndx_record_t *ndx_get_next_rec();
  2530. X
  2531. X#endif /* _DBF_NDX_H_ */
  2532. END_OF_FILE
  2533. if test 2545 -ne `wc -c <'dbf_ndx.h'`; then
  2534.     echo shar: \"'dbf_ndx.h'\" unpacked with wrong size!
  2535. fi
  2536. # end of 'dbf_ndx.h'
  2537. fi
  2538. if test -f 'dbf_ndx.c' -a "${1}" != "-c" ; then 
  2539.   echo shar: Will not clobber existing file \"'dbf_ndx.c'\"
  2540. else
  2541. echo shar: Extracting \"'dbf_ndx.c'\" \(4230 characters\)
  2542. sed "s/^X//" >'dbf_ndx.c' <<'END_OF_FILE'
  2543. X/*
  2544. X * Copyright (c) 1991, 1992, 1993 Brad Eacker,
  2545. X *              (Music, Intuition, Software, and Computers)
  2546. X * All Rights Reserved
  2547. X */
  2548. X
  2549. X#include <stdio.h>
  2550. X#include <fcntl.h>
  2551. X
  2552. X#include "dbf.h"
  2553. X#include "dbf_ndx.h"
  2554. X
  2555. X#define    DEBUG    0
  2556. X
  2557. X/*
  2558. X * get the ndx header for this file
  2559. X */
  2560. Xndx_header_t *
  2561. Xndx_get_header(fd)
  2562. Xint fd;
  2563. X{
  2564. X    dndx_header_t    *dp;
  2565. X    ndx_header_t    *np;
  2566. X
  2567. X    if ((dp = (dndx_header_t *)malloc(NDX_PAGE_SZ)) == NULL)
  2568. X        return NULL;
  2569. X    if ((np = (ndx_header_t *)malloc(sizeof(ndx_header_t))) == NULL) {
  2570. X        free(dp);
  2571. X        return NULL;
  2572. X    }
  2573. X    if ((lseek(fd, 0, 0) < 0) || (read(fd, dp, NDX_PAGE_SZ) < 0)) {
  2574. X        free(dp); free(np);
  2575. X        return NULL;
  2576. X    }
  2577. X    np->ndx_hpage = dp;
  2578. X    np->ndx_fd = fd;
  2579. X    np->ndx_start_pg = get_long(dp->dndx_st_pg);
  2580. X    np->ndx_total_pgs = get_long(dp->dndx_tot_pg);
  2581. X    np->ndx_key_len = get_short(dp->dndx_key_len);
  2582. X    np->ndx_keys_ppg = get_short(dp->dndx_keys_ppg);
  2583. X    np->ndx_key_type = get_short(dp->dndx_key_type);
  2584. X    np->ndx_key_size = get_long(dp->dndx_size_key);
  2585. X    np->ndx_key_name = dp->dndx_key_name;
  2586. X    np->ndx_unique = dp->dndx_unique;
  2587. X
  2588. X    np->ndx_fp = NULL;
  2589. X
  2590. X    return np;
  2591. X}
  2592. X
  2593. Xndx_page_t *
  2594. Xndx_get_page(hp, pageno)
  2595. Xndx_header_t *hp;
  2596. Xint    pageno;
  2597. X{
  2598. X    ndx_page_t    *fp;
  2599. X    dndx_page_t    *dp;
  2600. X    ndx_record_t    *rp;
  2601. X
  2602. X#if DEBUG
  2603. X    printf("getting page %d", pageno);
  2604. X#endif
  2605. X    if ((fp = (ndx_page_t *)malloc(sizeof(ndx_page_t))) == NULL)
  2606. X        return NULL;
  2607. X    if ((dp = (dndx_page_t *)malloc(NDX_PAGE_SZ)) == NULL) {
  2608. X        free(fp);
  2609. X        return NULL;
  2610. X    }
  2611. X    if ((rp = (ndx_record_t *)malloc(sizeof(ndx_record_t) * hp->ndx_keys_ppg)) == NULL) {
  2612. X        free(dp); free(fp);
  2613. X        return NULL;
  2614. X    }
  2615. X    fp->ndxp_page_data = dp;
  2616. X    if ((lseek(hp->ndx_fd, pageno * NDX_PAGE_SZ, 0) < 0) ||
  2617. X        (read(hp->ndx_fd, dp, NDX_PAGE_SZ) < 0)) {
  2618. X        free(fp); free(dp);
  2619. X        return NULL;
  2620. X    }
  2621. X    fp->ndxp_parent = NULL;
  2622. X    fp->ndxp_page_no = pageno;
  2623. X    fp->ndxp_num_keys = get_long(dp->dndxp_num_keys);
  2624. X    bzero(rp, sizeof(ndx_record_t) * hp->ndx_keys_ppg);
  2625. X    fp->ndxp_records = rp;
  2626. X    fp->ndxp_header_p = hp;
  2627. X#if DEBUG
  2628. X    printf(", n_keys %d\n", fp->ndxp_num_keys);
  2629. X#endif
  2630. X    return fp;
  2631. X}
  2632. X
  2633. X/*
  2634. X * get the first entry for this ndx
  2635. X */
  2636. Xndx_page_t *
  2637. Xndx_get_first_pg(hp)
  2638. Xndx_header_t *hp;
  2639. X{
  2640. X    ndx_page_t    *fp, *cp;
  2641. X    dndx_page_t    *dp;
  2642. X
  2643. X    if (hp->ndx_fp)
  2644. X        return hp->ndx_fp;
  2645. X    if (fp = ndx_get_page(hp, hp->ndx_start_pg)) {
  2646. X        hp->ndx_fp = fp;
  2647. X    }
  2648. X    return fp;
  2649. X}
  2650. X
  2651. Xndx_record_t *
  2652. Xndx_get_record(fp, rec_no)
  2653. Xndx_page_t *fp;
  2654. Xint    rec_no;
  2655. X{
  2656. X    ndx_record_t        *rp;
  2657. X    ndx_header_t        *hp = fp->ndxp_header_p;
  2658. X    struct dndx_record    *drp;
  2659. X
  2660. X#if DEBUG
  2661. X    printf("page %d, rec %d: ", fp->ndxp_page_no, rec_no);
  2662. X#endif
  2663. X    if (rec_no >= fp->ndxp_num_keys)
  2664. X        return NULL;
  2665. X    rp = &(fp->ndxp_records[rec_no]);
  2666. X    if (!rp->ndxr_page) {
  2667. X        rp->ndxr_page = fp;
  2668. X        drp = (dndx_record_t *)((u_char *)&fp->ndxp_page_data->dndx_rp
  2669. X                + rec_no * hp->ndx_key_size);
  2670. X        rp->ndxr_left = get_long(drp->dndx_left_pg);
  2671. X        rp->ndxr_rec = get_long(drp->dndx_dbf_rec);
  2672. X        rp->ndxr_key_data = &drp->dndx_key_data;
  2673. X        rp->ndxr_p_nrec = rec_no;
  2674. X    }
  2675. X#if DEBUG
  2676. X    printf("left %d, dbf_rec %d, data '%s'\n", rp->ndxr_left,
  2677. X        rp->ndxr_rec, rp->ndxr_key_data);
  2678. X#endif
  2679. X    return rp;
  2680. X}
  2681. X
  2682. Xndx_record_t *
  2683. Xndx_scan_down(hp, fp, recno)
  2684. Xndx_header_t    *hp;
  2685. Xndx_page_t    *fp;
  2686. Xint    recno;
  2687. X{
  2688. X    ndx_page_t    *np;
  2689. X    ndx_record_t    *rp;
  2690. X
  2691. X    while ((rp = ndx_get_record(fp, recno)) && (rp->ndxr_rec == 0)) {
  2692. X        np = ndx_get_page(hp, rp->ndxr_left);
  2693. X        np->ndxp_parent = fp;
  2694. X        np->ndxp_par_rno = recno;
  2695. X        fp = np;
  2696. X        recno = 0;
  2697. X    }
  2698. X    return rp;
  2699. X}
  2700. X
  2701. Xndx_record_t *
  2702. Xndx_scan_up(hp, fp, recno)
  2703. Xndx_header_t    *hp;
  2704. Xndx_page_t    *fp;
  2705. Xint    recno;
  2706. X{
  2707. X    ndx_page_t    *np;
  2708. X    ndx_record_t    *rp;
  2709. X
  2710. X    if (fp == NULL)
  2711. X        rp = NULL;
  2712. X    else if (recno < fp->ndxp_num_keys) {
  2713. X        rp = ndx_scan_down(hp, fp, recno);
  2714. X    } else {
  2715. X        rp = ndx_scan_up(hp, fp->ndxp_parent, fp->ndxp_par_rno + 1);
  2716. X    }
  2717. X    return rp;
  2718. X}
  2719. X
  2720. Xndx_record_t *
  2721. Xndx_get_first_rec(hp)
  2722. Xndx_header_t *hp;
  2723. X{
  2724. X    ndx_page_t    *fp;
  2725. X    ndx_record_t    *rp = NULL;
  2726. X
  2727. X    if (fp = ndx_get_first_pg(hp)) {
  2728. X        fp->ndxp_last_key = 0;
  2729. X        rp = ndx_scan_down(hp, fp, 0);
  2730. X    }
  2731. X    hp->ndx_cur_rec = rp;
  2732. X    return rp;
  2733. X}
  2734. X
  2735. Xndx_record_t *
  2736. Xndx_get_next_rec(hp, rp)
  2737. Xndx_header_t *hp;
  2738. Xndx_record_t *rp;
  2739. X{
  2740. X    ndx_page_t    *fp, *np;
  2741. X    int        rec_no;
  2742. X
  2743. X    fp = rp->ndxr_page;
  2744. X    rec_no = rp->ndxr_p_nrec + 1;
  2745. X    if (rec_no < fp->ndxp_num_keys) {
  2746. X        rp = ndx_scan_down(hp, fp, rec_no);
  2747. X    } else {
  2748. X        rp = ndx_scan_up(hp, fp->ndxp_parent, fp->ndxp_par_rno + 1);
  2749. X    }
  2750. X    return rp;
  2751. X}
  2752. X
  2753. END_OF_FILE
  2754. if test 4230 -ne `wc -c <'dbf_ndx.c'`; then
  2755.     echo shar: \"'dbf_ndx.c'\" unpacked with wrong size!
  2756. fi
  2757. # end of 'dbf_ndx.c'
  2758. fi
  2759. if test -f 'dbfndx.c' -a "${1}" != "-c" ; then 
  2760.   echo shar: Will not clobber existing file \"'dbfndx.c'\"
  2761. else
  2762. echo shar: Extracting \"'dbfndx.c'\" \(1690 characters\)
  2763. sed "s/^X//" >'dbfndx.c' <<'END_OF_FILE'
  2764. X/*
  2765. X * Copyright (c) 1993 Brad Eacker,
  2766. X *              (Music, Intuition, Software, and Computers)
  2767. X * All Rights Reserved
  2768. X */
  2769. X
  2770. X#define    USAGE    "usage: dbfndx [-v] <ndx file>\n"
  2771. X
  2772. X/*
  2773. X * list the records in question to std out using the specified
  2774. X * index file.
  2775. X */
  2776. X#include <stdio.h>
  2777. X#include <fcntl.h>
  2778. X
  2779. X#include "dbf.h"
  2780. X#include "dbf_ndx.h"
  2781. X
  2782. Xmain(argc, argv)
  2783. Xint    argc;
  2784. Xchar    **argv;
  2785. X{
  2786. X    ndx_header_t     *ndh;
  2787. X    char    *fnp;
  2788. X    u_char    *cp;
  2789. X    int    fd, i;
  2790. X    extern int optind;
  2791. X    extern char *optarg;
  2792. X    int    verbose = 0;
  2793. X    ndx_record_t    *rp;
  2794. X
  2795. X    if (argc < 2) {
  2796. X        printf(USAGE);
  2797. X        exit(1);
  2798. X    }
  2799. X    while ((i = getopt(argc, argv, "v")) != EOF) {
  2800. X        switch (i) {
  2801. X            case 'v':
  2802. X            verbose++;
  2803. X            break;
  2804. X            default:
  2805. X            printf(USAGE);
  2806. X            exit(1);
  2807. X        }
  2808. X    }
  2809. X    argc -= optind;  argv = &argv[optind];
  2810. X    cp = (u_char *)malloc(256);
  2811. X    if ((fd = open(*argv, O_RDONLY)) < 0) {
  2812. X        strcpy(cp, *argv); strcat(cp, ".ndx");
  2813. X        if ((fd = open(cp, O_RDONLY)) < 0) {
  2814. X            perror("open");
  2815. X            exit(1);
  2816. X        }
  2817. X    }
  2818. X
  2819. X    if ((ndh = ndx_get_header(fd)) == 0) {
  2820. X        fprintf(stderr, "Unable to get header\n");
  2821. X        exit(1);
  2822. X    }
  2823. X
  2824. X    if (verbose) {
  2825. X        fprintf(stderr, "# starting page %d, total pages %d\n",
  2826. X            ndh->ndx_start_pg, ndh->ndx_total_pgs);
  2827. X        fprintf(stderr, "# key length %d, keys/page %d, key size %d\n",
  2828. X            ndh->ndx_key_len, ndh->ndx_keys_ppg,
  2829. X            ndh->ndx_key_size);
  2830. X        fprintf(stderr, "# key type %d, unique %d\n",
  2831. X            ndh->ndx_key_type, ndh->ndx_unique);
  2832. X        fprintf(stderr, "# key name '%s'\n", ndh->ndx_key_name);
  2833. X    }
  2834. X    rp = ndx_get_first_rec(ndh);
  2835. X    while (rp) {
  2836. X        if ( !verbose )
  2837. X            printf("%d\n", rp->ndxr_rec);
  2838. X        else {
  2839. X            strncpy(cp, rp->ndxr_key_data, ndh->ndx_key_len);
  2840. X            printf("%d : '%s'\n", rp->ndxr_rec, cp);
  2841. X        }
  2842. X        rp = ndx_get_next_rec(ndh, rp);
  2843. X    }
  2844. X}
  2845. END_OF_FILE
  2846. if test 1690 -ne `wc -c <'dbfndx.c'`; then
  2847.     echo shar: \"'dbfndx.c'\" unpacked with wrong size!
  2848. fi
  2849. # end of 'dbfndx.c'
  2850. fi
  2851. if test -f 'dbfcreat.c' -a "${1}" != "-c" ; then 
  2852.   echo shar: Will not clobber existing file \"'dbfcreat.c'\"
  2853. else
  2854. echo shar: Extracting \"'dbfcreat.c'\" \(4503 characters\)
  2855. sed "s/^X//" >'dbfcreat.c' <<'END_OF_FILE'
  2856. X/*
  2857. X * Copyright (c) 1993 Brad Eacker,
  2858. X *              (Music, Intuition, Software, and Computers)
  2859. X * All Rights Reserved
  2860. X */
  2861. X
  2862. X#define    USAGE    "usage: dbfcreat [-v] <file> <target xbase>\n"
  2863. X
  2864. X/*
  2865. X * display the database in question to the stdout
  2866. X */
  2867. X#include <stdio.h>
  2868. X#include <fcntl.h>
  2869. X
  2870. X#include "dbf.h"
  2871. X
  2872. X#define    OPEN_RDWR    (O_RDWR | O_CREAT | O_TRUNC)
  2873. X#define    OPEN_RDONLY    (O_RDONLY)
  2874. X
  2875. Xstruct db_field creat_f[] = {
  2876. X    {"FIELD_NAME", 'C', 10, 0, NULL},
  2877. X    {"FIELD_TYPE", 'C',  1, 0, NULL},
  2878. X    {"FIELD_LEN",  'N',  3, 0, NULL},
  2879. X    {"FIELD_DEC",  'N',  4, 0, NULL},
  2880. X};
  2881. X
  2882. Xmain(argc, argv)
  2883. Xint    argc;
  2884. Xchar    **argv;
  2885. X{
  2886. X    dbhead_t     *dbh, *tdbh;
  2887. X    dbfield_t    *dbf, *cur_f, *tdbf, *tcur_f;
  2888. X    char    *fnp;
  2889. X    u_char    *cp, *tcp;
  2890. X    int    fd, nfields;
  2891. X    int    tfd, tnfields;
  2892. X    int    rec_cnt, i;
  2893. X    extern int optind;
  2894. X    extern char *optarg;
  2895. X    int    verbose = 0;
  2896. X    int    fail = 0;
  2897. X
  2898. X    while ((i = getopt(argc, argv, "v")) != EOF) {
  2899. X        switch (i) {
  2900. X            case 'v':
  2901. X            verbose++;
  2902. X            break;
  2903. X            default:
  2904. X            printf(USAGE);
  2905. X            exit(1);
  2906. X        }
  2907. X    }
  2908. X    argc -= optind;  argv = &argv[optind];
  2909. X    if (argc < 2) {
  2910. X        printf(USAGE);
  2911. X        exit(1);
  2912. X    }
  2913. X    if ((fd = open(*argv, OPEN_RDONLY)) < 0) {
  2914. X        cp = (u_char *)malloc(256);
  2915. X        strcpy(cp, *argv); strcat(cp, ".dbf");
  2916. X        if ((fd = open(cp, OPEN_RDONLY)) < 0) {
  2917. X            perror("open");
  2918. X            exit(1);
  2919. X        }
  2920. X        free(cp);
  2921. X    }
  2922. X    argv++;
  2923. X
  2924. X    cp = (u_char *)malloc(256);
  2925. X    strcpy(cp, *argv);
  2926. X    if (strchr(cp, ".dbf") == NULL)
  2927. X        strcat(cp, ".dbf");
  2928. X    if ((tfd = open(cp, OPEN_RDWR, 0644)) < 0) {
  2929. X        perror("open");
  2930. X        exit(1);
  2931. X    }
  2932. X    free(cp);
  2933. X
  2934. X    if ((dbh = get_dbf_head(fd)) ==     0) {
  2935. X        fprintf(stderr, "Unable to get header\n");
  2936. X        exit(1);
  2937. X    }
  2938. X    if (verbose) {
  2939. X        printf("# total field records %d\n", dbh->db_records);
  2940. X    }
  2941. X    dbf = dbh->db_fields;
  2942. X    if ((nfields = dbh->db_nfields) != 4) {
  2943. X        fprintf(stderr, "number of fields must be 4");
  2944. X        exit(1);
  2945. X    }
  2946. X    tcur_f = creat_f;
  2947. X    for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++, tcur_f++) {
  2948. X        if (strcmp(cur_f->db_fname, tcur_f->db_fname) != 0) {
  2949. X            fprintf(stderr, "field name mismatch, '%s' != '%s'\n",
  2950. X                cur_f->db_fname, tcur_f->db_fname);
  2951. X            fail = 1;
  2952. X        }
  2953. X        if (cur_f->db_type != tcur_f->db_type) {
  2954. X            fprintf(stderr, "field type mismatch, '%c' != '%c'\n",
  2955. X                cur_f->db_type, tcur_f->db_type);
  2956. X            fail = 1;
  2957. X        }
  2958. X    }
  2959. X    if (fail) {
  2960. X        exit(1);
  2961. X    }
  2962. X
  2963. X    tdbh = (dbhead_t *)malloc(sizeof(dbhead_t));
  2964. X    tdbf = (dbfield_t *)malloc(sizeof(dbfield_t) * dbh->db_records);
  2965. X    if (tdbh == NULL || tdbf == NULL) {
  2966. X        fprintf(stderr, "unable to get memory for header info\n");
  2967. X        exit(1);
  2968. X    }
  2969. X    tdbh->db_fields = tdbf;
  2970. X    tdbh->db_fd = tfd;
  2971. X    tdbh->db_dbt = DBH_TYPE_NORMAL;
  2972. X    strcpy(tdbh->db_date, "19930818");
  2973. X    tdbh->db_records = 0;
  2974. X
  2975. X    /* step thru the records */
  2976. X    tcp = (u_char *)malloc(256);
  2977. X    tcur_f = tdbf; nfields = 0;
  2978. X    for (rec_cnt = 1; rec_cnt <= dbh->db_records; rec_cnt++) {
  2979. X        if ((cp = get_dbf_record(dbh, rec_cnt)) == NULL) {
  2980. X            printf("tried to read bad record %d\n", rec_cnt);
  2981. X            break;
  2982. X        }
  2983. X        if (*cp == DELETED_RECORD) {
  2984. X            free(cp);
  2985. X            continue;
  2986. X        }
  2987. X        cur_f = dbf;
  2988. X        copy_crimp(tcur_f->db_fname, &cp[cur_f->db_foffset],
  2989. X                    cur_f->db_flen);
  2990. X        cur_f++;
  2991. X        tcur_f->db_type = cp[cur_f->db_foffset];
  2992. X        cur_f++;
  2993. X        strncpy(tcp, &cp[cur_f->db_foffset], cur_f->db_flen);
  2994. X        tcp[cur_f->db_flen] = 0;
  2995. X        tcur_f->db_flen = strtol(tcp, (char *)NULL, 0);
  2996. X        cur_f++;
  2997. X        strncpy(tcp, &cp[cur_f->db_foffset], cur_f->db_flen);
  2998. X        tcp[cur_f->db_flen] = 0;
  2999. X        tcur_f->db_fdc = strtol(tcp, (char *)NULL, 0);
  3000. X
  3001. X        switch (tcur_f->db_type) {
  3002. X            case 'L':
  3003. X            if (tcur_f->db_flen != 1) {
  3004. X                fprintf(stderr, "Logical field len != 1\n");
  3005. X                fail = 1;
  3006. X            }
  3007. X            break;
  3008. X            case 'M':
  3009. X            if (tcur_f->db_flen != 9) {
  3010. X                fprintf(stderr, "Memo Field len != 9\n");
  3011. X                fail = 1;
  3012. X            }
  3013. X            tdbh->db_dbt = DBH_TYPE_MEMO;
  3014. X            break;
  3015. X            case 'C':
  3016. X            case 'D':
  3017. X            case 'N':
  3018. X            break;
  3019. X            default:
  3020. X            fprintf(stderr, "unknown field type - %c",
  3021. X                     cur_f->db_type);
  3022. X            fail = 1;
  3023. X        }
  3024. X        free(cp);
  3025. X        tcur_f->db_format = get_dbf_f_fmt(tcur_f);
  3026. X        tcur_f++; nfields++;
  3027. X    }
  3028. X    free(tcp);
  3029. X
  3030. X    if (fail) {
  3031. X        exit(1);
  3032. X    }
  3033. X
  3034. X    tdbh->db_nfields = nfields;
  3035. X    tdbh->db_hlen = sizeof(struct dbf_dhead) + 2 +
  3036. X                nfields * sizeof(struct dbf_dfield);
  3037. X
  3038. X    if (verbose) {
  3039. X        printf("# total fields %d\n", tdbh->db_nfields);
  3040. X
  3041. X        /* put out the field headings */
  3042. X                for (cur_f = tdbf; cur_f < &tdbf[nfields] ; cur_f++) {
  3043. X                        printf("# %s, %c, %d, %d\n", cur_f->db_fname,
  3044. X                                cur_f->db_type, cur_f->db_flen, cur_f->db_fdc);
  3045. X                }
  3046. X    }
  3047. X
  3048. X    if (cp = db_cur_date(NULL)) {
  3049. X        strncpy(tdbh->db_date, cp, 8);
  3050. X    }
  3051. X
  3052. X    put_dbf_info(tdbh);
  3053. X    exit(0);
  3054. X}
  3055. END_OF_FILE
  3056. if test 4503 -ne `wc -c <'dbfcreat.c'`; then
  3057.     echo shar: \"'dbfcreat.c'\" unpacked with wrong size!
  3058. fi
  3059. # end of 'dbfcreat.c'
  3060. fi
  3061. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  3062.   echo shar: Will not clobber existing file \"'Makefile'\"
  3063. else
  3064. echo shar: Extracting \"'Makefile'\" \(2450 characters\)
  3065. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  3066. X
  3067. X# Copyright (c) 1991, 1992, 1993 Brad Eacker,
  3068. X#              (Music, Intuition, Software, and Computers)
  3069. X# All Rights Reserved
  3070. X
  3071. X# if you don't have alloca uncomment the next lines
  3072. XALLOCA='-Dalloca=malloc'
  3073. X# ALLOCA_OBJ=alloca.o
  3074. X
  3075. X# if u_char is already defined in your system uncomment the following
  3076. XEX_FLAGS=-DUCHAR
  3077. X
  3078. X# if you need to use bison uncomment the following
  3079. X# YACC='bison -y'
  3080. X
  3081. XCFLAGS=-O $(ALLOCA) $(EX_FLAGS)
  3082. XYFLAGS=-d
  3083. X
  3084. XSHELL=/bin/sh
  3085. X
  3086. XTARGETS = dbflst tmpl dbfadd dbfdel dbfpack dbfget dbfndx dbfcreat
  3087. XTHINGS = tmpl.dbf
  3088. XTEST_TARGS = dbftst lexi gram
  3089. X
  3090. XDBF_SRCS=dbf.h dbf_head.c dbf_rec.c dbf_misc.c dbftst.c dbflst.c \
  3091. X    token.l gram.y dbinter.c dbf_sym.h yyerr.c tmpl.c dbfadd.c \
  3092. X    dbfdel.c dbfpack.c dbfget.c dbf_ndx.h dbf_ndx.c dbfndx.c \
  3093. X    dbfcreat.c
  3094. XDBF_OBJS=dbf_head.o dbf_rec.o dbf_misc.o dbf_ndx.o
  3095. XOBJS=dbinter.o $(ALLOCA_OBJ)
  3096. X
  3097. Xall: $(TARGETS) $(THINGS)
  3098. X
  3099. Xtest: $(TEST_TARGS)
  3100. X
  3101. Xeverything: all test
  3102. X
  3103. Xextras: tmpl.dbf
  3104. X
  3105. Xdbftst: dbftst.o $(DBF_OBJS)
  3106. X    $(CC) -o $@ dbftst.o $(DBF_OBJS)
  3107. X
  3108. Xdbflst: dbflst.o $(DBF_OBJS)
  3109. X    $(CC) -o $@ dbflst.o $(DBF_OBJS)
  3110. X
  3111. Xlexi: lex.yy.c
  3112. X    $(CC) $(CFLAGS) -DDEBUG lex.yy.c -o $@ -ll
  3113. X
  3114. Xgram: gram.tab.c lex.yy.c yyerr.o $(OBJS)
  3115. X    $(CC) $(CFLAGS) -DYYDEBUG gram.tab.c lex.yy.c yyerr.o $(OBJS) -o $@ -ll
  3116. X
  3117. Xtmpl.dbf: tmpl
  3118. X    ./tmpl
  3119. X
  3120. Xtmpl: tmpl.o $(DBF_OBJS)
  3121. X    $(CC) -o $@ tmpl.o $(DBF_OBJS)
  3122. X
  3123. Xdbfadd: dbfadd.o $(DBF_OBJS)
  3124. X    $(CC) -o $@ dbfadd.o $(DBF_OBJS)
  3125. X
  3126. Xdbfdel: dbfdel.o $(DBF_OBJS)
  3127. X    $(CC) -o $@ dbfdel.o $(DBF_OBJS)
  3128. X
  3129. Xdbfpack: dbfpack.o $(DBF_OBJS)
  3130. X    $(CC) -o $@ dbfpack.o $(DBF_OBJS)
  3131. X
  3132. Xdbfget: dbfget.o $(DBF_OBJS)
  3133. X    $(CC) -o $@ dbfget.o $(DBF_OBJS)
  3134. X
  3135. Xdbfcreat: dbfcreat.o $(DBF_OBJS)
  3136. X    $(CC) -o $@ dbfcreat.o $(DBF_OBJS)
  3137. X
  3138. Xdbfndx: dbfndx.o $(DBF_OBJS)
  3139. X    $(CC) -o $@ dbfndx.o $(DBF_OBJS)
  3140. X
  3141. Xlex.yy.c: token.l
  3142. X    lex token.l
  3143. X
  3144. Xgram.tab.c: gram.y
  3145. X    $(YACC) $(YFLAGS) gram.y
  3146. X    if [ -f y.tab.c ] ; then \
  3147. X        mv y.tab.c gram.tab.c; \
  3148. X        mv y.tab.h gram.tab.h; \
  3149. X    fi
  3150. X
  3151. Xshar:
  3152. X    shar README $(DBF_SRCS) Makefile HISTORY >dbf.shar
  3153. X
  3154. Xclean:
  3155. X    rm -f *.o lex.yy.c y.tab.[ch] y.output gram.tab.[ch]
  3156. X    rm -f errs output *~ tg.out
  3157. X
  3158. Xclobber: clean
  3159. X    rm -f $(TEST_TARGS) $(TARGETS) $(THINGS)
  3160. X
  3161. Xdbf_head.o: dbf.h dbf_head.c
  3162. Xdbf_rec.o: dbf.h dbf_rec.c
  3163. Xdbf_misc.o: dbf.h dbf_misc.c
  3164. Xdbf_ndx.o: dbf.h dbf_ndx.h dbf_ndx.c
  3165. Xyyerr.o: yyerr.c
  3166. Xdbinter.o: dbinter.c
  3167. Xdbflst.o: dbf.h dbflst.c
  3168. Xdbftst.o: dbf.h dbftst.c
  3169. Xdbfadd.o: dbf.h dbfadd.c
  3170. Xdbfdel.o: dbf.h dbfdel.c
  3171. Xdbfpack.o: dbf.h dbfpack.c
  3172. Xdbfget.o: dbf.h dbfget.c
  3173. Xdbfndx.o: dbf.h dbf_ndx.h dbfndx.c
  3174. Xtmpl.o: dbf.h tmpl.c
  3175. END_OF_FILE
  3176. if test 2450 -ne `wc -c <'Makefile'`; then
  3177.     echo shar: \"'Makefile'\" unpacked with wrong size!
  3178. fi
  3179. # end of 'Makefile'
  3180. fi
  3181. if test -f 'HISTORY' -a "${1}" != "-c" ; then 
  3182.   echo shar: Will not clobber existing file \"'HISTORY'\"
  3183. else
  3184. echo shar: Extracting \"'HISTORY'\" \(606 characters\)
  3185. sed "s/^X//" >'HISTORY' <<'END_OF_FILE'
  3186. XRevision History of DBF
  3187. X
  3188. XVersion 1.5        10/27/93
  3189. X    released to comp.sources.misc
  3190. X
  3191. X    added the SHELL variable to the Makefile so that the embedded
  3192. X    scripts will function properly
  3193. X
  3194. X    added the dbfcreat program to use a database of the proper structure
  3195. X    to create a new database
  3196. X
  3197. X    modified all the programs that modify the database to change the
  3198. X    last modified field in the header of the database to the current date
  3199. X
  3200. X    added this HISTORY file to the package
  3201. X
  3202. XVersion 1.4        8/17/93
  3203. X    initial release to the net as a whole (comp.database)
  3204. X
  3205. XVersion 1.1-1.3
  3206. X    various point releases to specific people.
  3207. X
  3208. X$Revision: 1.4 $
  3209. END_OF_FILE
  3210. if test 606 -ne `wc -c <'HISTORY'`; then
  3211.     echo shar: \"'HISTORY'\" unpacked with wrong size!
  3212. fi
  3213. # end of 'HISTORY'
  3214. fi
  3215. echo shar: End of shell archive.
  3216. exit 0
  3217.  
  3218.  
  3219.  
  3220.  
  3221.  
  3222. exit 0 # Just in case...
  3223.