Table of Contents Previous Chapter
Appendix C: Sample BURT Program

Appendix C: Sample BURT Program

1. snap.c

/* for getpwuid() */
#include <pwd.h>

/* for time() */
#include <sys/types.h>
#include <sys/time.h>

/* for geteuid() */
#include <unistd.h>

#include <burtpublic.h>

#include <SDDS.h>

main()
{

SDDS_TABLE table;
int effective_uid;
time_t currtime;
struct passwd *pp;
char buff[100];

  if (!SDDS_InitializeOutput(&table, SDDS_ASCII, 1L, NULL, NULL, "Snapshot"))
  {
    fprintf(stderr, "ERROR: unable to initialize table.\n");
    exit(1);
  } /* endif */

  /***************************/
  /*                         */
  /* Defining the Parameters */
  /*                         */
  /***************************/
  /* first, make all the necessary UNIX calls */

  if (time(&currtime) == (time_t) -1)
  {
    fprintf(stderr, "ERROR: unable to get current time.\n");
    exit(1);
  } /* endif */

  effective_uid = geteuid();

  if ((pp = getpwuid(effective_uid)) == NULL)
  {
    fprintf(stderr, "ERROR: unable to get user information.\n");
    exit(1);
  } /* endif */

  /* time stamp */
  if (!SDDS_DefineParameter(&table, TIMEHEADERSTRING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, ctime(&currtime)) == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      TIMEHEADERSTRING);
    exit(1);
  } /* endif */

  /* loginid (real world name) */
  sprintf(buff, "%s (%s)", pp->pw_name, pp->pw_gecos);
  if (!SDDS_DefineParameter(&table, LOGINHEADERSTING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, buff) == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      LOGINHEADERSTING);
    exit(1);
  } /* endif */

  /* effective uid */
  /* uid - person who logged in ... effective uid person as */
  /* defined by "set-user-ID" (if done at all)              */
  sprintf(buff, "%d", (int) pp->pw_uid);
  if (!SDDS_DefineParameter(&table, EFFUIDHEADERSTRING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, buff) == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      EFFUIDHEADERSTRING);
    exit(1);
  } /* endif */

  /* group id */
  sprintf(buff, "%d", (int) pp->pw_gid);
  if (!SDDS_DefineParameter(&table, GROUPIDHEADERSTRING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, buff) == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      GROUPIDHEADERSTRING);
    exit(1);
  } /* endif */

  /* keywords */
  if (!SDDS_DefineParameter(&table, KEYWORDSHEADERSTRING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, "these are keywords") == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      KEYWORDSHEADERSTRING);
    exit(1);
  } /* endif */

  /* comments */
  if (!SDDS_DefineParameter(&table, COMMENTSHEADERSTRING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, "these are comments") == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      COMMENTSHEADERSTRING);
    exit(1);
  } /* endif */

  /* snapshot type, Absolute */
  if (!SDDS_DefineParameter(&table, TYPEHEADERSTRING, 
    NULL, NULL, NULL, NULL, SDDS_STRING, ABSOLUTESTRING) == -1)
  {
    fprintf(stderr, "ERROR: could not define parameter >%s<.\n",
      TYPEHEADERSTRING);
    exit(1);
  } /* endif */

  /************************/
  /*                      */
  /* Defining the Columns */
  /*                      */
  /************************/

  if (SDDS_DefineColumn(&table, NAME_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", NAME_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, TYPE_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", TYPE_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, LINEAGE_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", LINEAGE_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, READMSG_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", READMSG_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, WRITEMSG_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", WRITEMSG_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, MODE_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", MODE_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, NELEM_COL, 
    NULL, NULL, NULL, NULL, SDDS_LONG, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", NELEM_COL);
    exit(1);
  } /* endif */

  if (SDDS_DefineColumn(&table, VAL_COL, 
    NULL, NULL, NULL, NULL, SDDS_STRING, 0) == -1)
  {
    fprintf(stderr, "ERROR: could not define column >%s<.\n", VAL_COL);
    exit(1);
  } /* endif */

  /**********************/
  /*                    */
  /* Writing the Header */
  /*                    */
  /**********************/

  if (!SDDS_WriteLayout(&table))
  {
    fprintf(stderr, "ERROR: could not write header.\n");
    exit(1);
  } /* endif */

  /***************************/
  /*                         */
  /* Starting the Data Table */
  /*                         */
  /***************************/

  if (!SDDS_StartTable(&table, 5L))
  {
    fprintf(stderr, "ERROR: unable to start the data table\n");
    exit(1);
  } /* endif */

  /*******************************/
  /*                             */
  /* Filling the Table With Data */
  /*                             */
  /*******************************/

  /* row 0: scalar pv, name="burtgenerator" val=0.0 */
  if (!SDDS_SetRowValues(&table, 
    (long) (SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE), 0L,
    NAME_COL, "burtgenerator",
    TYPE_COL, PVSTRING,
    LINEAGE_COL, DEFAULTSTRING,
    READMSG_COL, DEFAULTSTRING,
    WRITEMSG_COL, DEFAULTSTRING,
    MODE_COL, DEFAULTSTRING,
    NELEM_COL, 1L,
    VAL_COL, "0.0",
    NULL))
  {
    fprintf(stderr, "ERROR: unable to set row 0\n");
    exit(1);
  } /* endif */

  /* row 1: device, name="burtdevao" val=1.0 mode=RO */
  if (!SDDS_SetRowValues(&table, 
    (long) (SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE), 1L,
    NAME_COL, "burtdevao",
    TYPE_COL, DEVSTRING,
    LINEAGE_COL, DEFAULTSTRING,
    READMSG_COL, DEFAULTREADMSG,
    WRITEMSG_COL, DEFAULTWRITEMSG,
    MODE_COL, READONLYSTRING,
    NELEM_COL, 1L,
    VAL_COL, "1.0",
    NULL))
  {
    fprintf(stderr, "ERROR: unable to set row 1\n");
    exit(1);
  } /* endif */

  /* row 2: device, name="burtdevcalc" val=2.0 mode=RON */
  if (!SDDS_SetRowValues(&table, 
    (long) (SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE), 2L,
    NAME_COL, "burtdevcalc",
    TYPE_COL, DEVSTRING,
    LINEAGE_COL, DEFAULTSTRING,
    READMSG_COL, DEFAULTREADMSG,
    WRITEMSG_COL, DEFAULTWRITEMSG,
    MODE_COL, READONLYNOTIFYSTRING,
    NELEM_COL, 1L,
    VAL_COL, "2.0",
    NULL))
  {
    fprintf(stderr, "ERROR: unable to set row 2\n");
    exit(1);
  } /* endif */

  /* row 3: device, name="burtdevcalc" val=3.0 parent=burtdevcomp */
  /*                readmsg="read" */
  if (!SDDS_SetRowValues(&table, 
    (long) (SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE), 3L,
    NAME_COL, "burtdevcalc",
    TYPE_COL, DEVSTRING,
    LINEAGE_COL, "burtdevcomp",
    READMSG_COL, "read",
    WRITEMSG_COL, DEFAULTWRITEMSG,
    MODE_COL, DEFAULTSTRING,
    NELEM_COL, 1L,
    VAL_COL, "3.0",
    NULL))
  {
    fprintf(stderr, "ERROR: unable to set row 3\n");
    exit(1);
  } /* endif */

  /* row 4: vector pv, name="burtwaveform" nelem=6 */
  /*                   val=[4.0 4.1 4.2 4.3 4.4 <missing> <missing> ] */
  sprintf(buff, "4.0 4.1 4.2 4.3 %s %s", NULLSTRING, NULLSTRING);
  if (!SDDS_SetRowValues(&table, 
    (long) (SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE), 4L,
    NAME_COL, "burtwaveform",
    TYPE_COL, PVSTRING,
    LINEAGE_COL, DEFAULTSTRING,
    READMSG_COL, DEFAULTSTRING,
    WRITEMSG_COL, DEFAULTSTRING,
    MODE_COL, DEFAULTSTRING,
    NELEM_COL, 6L,
    VAL_COL, buff,
    NULL))
  {
    fprintf(stderr, "ERROR: unable to set row 4\n");
    exit(1);
  } /* endif */

  /**************************/
  /*                        */
  /* Writing the Data Table */
  /*                        */
  /**************************/

  if (!SDDS_WriteTable(&table))
  {
    fprintf(stderr, "ERROR: could not write table.\n");
    exit(1);
  } /* endif */

  /***********/
  /*         */
  /* Cleanup */
  /*         */
  /***********/

  if (!SDDS_Terminate(&table))
  {
    fprintf(stderr, "ERROR: could not terminate SDDS table.\n");
    exit(1);
  } /* endif */

} /* end main() */

2. makefile

CC = acc

EPICS = /net/phebos/epics/add_on

BURTINCDIR = -I$(EPICS)/src/burt
SDDSINCDIR = -I$(EPICS)/src/sdds/include

INCLUDEDIRS = $(BURTINCDIR) $(SDDSINCDIR) 

SDDSLIBDIR = -L$(EPICS)/lib

LIBDIRS = $(SDDSLIBDIR)

LIBS = -lSDDS1 -lnamelist -lmdblib 
CFLAGS = -c

snap:  snap.o
  $(CC) -o snap snap.o $(LIBDIRS) $(LIBS)

clean:
  /bin/rm -f *.o snap 

.c.o:  $*.c
  $(CC) $(CFLAGS) $(INCLUDEDIRS) $*.c
 
Table of Contents Next Chapter