Listing 1

/*
 Copyright (C) 1992 by Mark W. Schumann
  
  convtext.cpp -- Convert a text file into
  one or more existing Clipper files under
  marker-file control.
  
  Compiler: Borland C++ 2.0.
  Library: SoftC version 3.0.
  
  20 April 1992, by Mark W. Schumann
  Usenet: mark@wariat.ncoast.org
  
  Compile (Borland) with:
  
  bcc -ms -lm convtext.cpp scdbp20s.lib
*/


#include <softc.h>
#include <sc_base.h>
#include <fstream.h>
#include <iostream.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>

#define LINELENGTH 200

int convtext (char *);
char *strtrim (char *);
int nextmark (int, long &, char *, char *);
int main (int argc, char *argv[])

{
   
   scdinit (5, 0);
   convtext ("POLLSEND.TXT");
   scdterm();
   
   }

int convtext (char *textfile)

{

ifstream ip;        // Text input stream.

char tempname[80];     // Builds file name.
char s[LINELENGTH+2];  // Text record buffer.
char *p;    // Throwaway pointer.

int dbf = -1;  // Output database handle.
long recno;    // Current record number.

int markdbf;        // Marker database handle.
char marktext[30];  // Text to indicate mark record.
char markfile[9];   // Output file indicated by mark.
long markrec = 0L;  // Current record in marker file.
int marklen;      // Length of marker for comparison.
   
   s[0] = ' ';         // Record status byte.
   
   ip.open (textfile);
if (!ip) {
   cout << "Couldn't open "<< textfile << ".\n";
   return -1;
   }

scddopenx (&markdbf, "DATAMARK.DBF", 0);
if (scecode() < 0) {
   cout << "Couldn't open marker file. "
    << "SoftC error was "<< scecode() << '\n';
   return -1;
   }

nextmark (markdbf, &markrec, marktext, markfile);
strtrim (marktext);
marklen = strlen (marktext);

while (ip.getline (&s[1], LINELENGTH)) {
   
   sceclr();
   
   // Trim trailing newline.
   p = strchr (&s[1], '\n');
   if (p != NULL) *p = '\0';
   
   // Next data marker record reached?
   if (strncmp (marktext, &s[1], marklen) == 0) {
      
      // Close current output database.
      if (dbf != -1) scddclose (dbf);
      
      // Build full name of the target file.
      strcpy (tempname, markfile);
      strtrim (tempname);
      strcat (tempname, ".DBF");
      
      // Now open it.
      cout << "\nOpening" << markfile << '\n';
      scddopenx (&dbf, tempname,
       SC_RDWR | SC_EXCLUDE);
      
      scddsize (dbf, &recno);
      
      // Use the next marker.
      nextmark (markdbf, markrec,
       marktext, markfile);
      
      if (scecode() < 0) {
         cout << "Error opening" <<
          tempname << ". SoftC error was "<<
          scecode() << '\n';
         break;
         }
      
      }
    
    else {
      
      if (dbf == -1) {
         cout << "Input file doesn't begin with a" <<
          " data marker.\n";
         break;
         }
      
      recno++;
      
      // Write the record to the database.
      if (scddrputx (dbf, s, &recno, SC_ADD) < 0) {
         cout << "Couldn't add record" << recno
          << "; SoftC error" << scecode()
          << ' ' << scemsg() << '\n';
         break;
           }
        else
           cout << "Record number" << recno
            <<" added.\r";
        
        }
     }
  
  cout << '\n';
  ip.close();
  scddclose (markdbf);
  if (dbf != -1) scddclose (dbf);
  return 0;
  
  }


// Remove trailing whitespace from a string.

char *strtrim (char *s)

{

register char *p;
char *q = NULL; // Last printing character.
  
  for (p = s; *p; p++)
     if (!isspace (*p)) q = p;
  
  if (q != NULL)
     *++q : '\0';
  else
     [0] = '\0';
  
  return s;
  }


// This assumes that we have a marker text description
// in field 1 and marker file name in field 2. It is
// also counting on character buffers long enough to
// hold the results.

int nextmark (int dbf, long &rec, char *text, char *file)

{
  
  scddrget (dbf, ++rec);
  scddfget (dbf, 1, text);
  scddfget (dbf, 2, file);
  return scecode();
  
  }
/* End of File */