41#include <lal/LALMalloc.h>
42#include <lal/LIGOLwXML.h>
43#include <lal/LIGOLwXMLRead.h>
44#include <lal/LIGOMetadataTables.h>
45#include <lal/LIGOMetadataUtils.h>
46#include <lal/XLALError.h>
60 memset(new->program, 0,
sizeof(new->program));
61 memset(new->version, 0,
sizeof(new->version));
62 memset(new->cvs_repository, 0,
sizeof(new->cvs_repository));
64 memset(new->comment, 0,
sizeof(new->comment));
66 memset(new->node, 0,
sizeof(new->node));
67 memset(new->username, 0,
sizeof(new->username));
71 memset(new->domain, 0,
sizeof(new->domain));
73 memset(new->ifos, 0,
sizeof(new->ifos));
107 for(; head; head = head->
next)
121 for(length = 0; head; head = head->
next)
137 const char *value_start;
138 const char *value_end;
152 value_start = strchr(cvs_string,
'$');
160 value_end = strchr(value_start,
':');
165 value_start = strchr(value_start,
'$');
171 value_start = value_end;
178 while(isspace(*++value_start));
186 value_end = strchr(value_start,
'$');
194 while(isspace(*--value_end));
196 if(value_end - value_start < 0)
197 value_end = value_start;
203 value = malloc((value_end - value_start + 1) *
sizeof(*value));
206 memcpy(value, value_start, (value_end - value_start) *
sizeof(*value));
207 value[value_end - value_start] =
'\0';
222 const char *program_name,
223 const char *cvs_revision,
224 const char *cvs_source,
225 const char *cvs_date,
229 char *cvs_keyword_value;
245 if(!cvs_keyword_value) {
246 XLALPrintError(
"%s(): cannot parse \"%s\"\n", __func__, cvs_revision);
250 free(cvs_keyword_value);
257 if(!cvs_keyword_value) {
258 XLALPrintError(
"%s(): cannot parse \"%s\"\n", __func__, cvs_source);
262 free(cvs_keyword_value);
269 if(!cvs_keyword_value) {
270 XLALPrintError(
"%s(): cannot parse \"%s\"\n", __func__, cvs_date);
273 if(!strptime(cvs_keyword_value,
"%Y/%m/%d %T", &utc)) {
274 if(!strptime(cvs_keyword_value,
"%Y-%m-%d %T", &utc)) {
275 XLALPrintError(
"%s(): cannot parse \"%s\"\n", __func__, cvs_keyword_value);
276 free(cvs_keyword_value);
280 free(cvs_keyword_value);
307 perror(
"could not determine host name");
311 if(!(pw = getpwuid(uid)))
328 const char *program_name,
329 const char *cvs_revision,
330 const char *cvs_source,
331 const char *cvs_date,
335 fprintf(stderr,
"XLALPopulateProcessTable() not implemented for WIN32\n");
349 static const char table_name[] =
"process";
353 struct MetaioParseEnvironment env;
374 if(MetaioOpenFile(&env,
filename)) {
375 XLALPrintError(
"%s(): error opening \"%s\": %s\n", __func__,
filename, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
378 if(MetaioOpenTableOnly(&env, table_name)) {
380 XLALPrintError(
"%s(): cannot find %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
389 column_pos.cvs_repository =
XLALLIGOLwFindColumn(&env,
"cvs_repository", METAIO_TYPE_LSTRING, 1);
390 column_pos.cvs_entry_time =
XLALLIGOLwFindColumn(&env,
"cvs_entry_time", METAIO_TYPE_INT_4S, 1);
407 XLALPrintError(
"%s(): failure reading %s table\n", __func__, table_name);
413 while((miostatus = MetaioGetRow(&env)) > 0) {
427 next = &(*next)->
next;
431 strncpy(row->
program, env.ligo_lw.table.elt[column_pos.program].data.lstring.data,
sizeof(row->
program) - 1);
432 strncpy(row->
version, env.ligo_lw.table.elt[column_pos.version].data.lstring.data,
sizeof(row->
version) - 1);
435 strncpy(row->
comment, env.ligo_lw.table.elt[column_pos.comment].data.lstring.data,
sizeof(row->
comment) - 1);
436 row->
is_online = env.ligo_lw.table.elt[column_pos.is_online].data.int_4s;
437 strncpy(row->
node, env.ligo_lw.table.elt[column_pos.node].data.lstring.data,
sizeof(row->
node) - 1);
438 strncpy(row->
username, env.ligo_lw.table.elt[column_pos.username].data.lstring.data,
sizeof(row->
username) - 1);
439 row->
unix_procid = env.ligo_lw.table.elt[column_pos.unix_procid].data.int_4s;
441 XLALGPSSet(&row->
end_time, env.ligo_lw.table.elt[column_pos.end_time].data.int_4s, 0);
442 row->
jobid = env.ligo_lw.table.elt[column_pos.jobid].data.int_4s;
443 strncpy(row->
domain, env.ligo_lw.table.elt[column_pos.domain].data.lstring.data,
sizeof(row->
domain) - 1);
444 strncpy(row->
ifos, env.ligo_lw.table.elt[column_pos.ifos].data.lstring.data,
sizeof(row->
ifos) - 1);
445 row->
process_id = env.ligo_lw.table.elt[column_pos.process_id].data.int_8s;
450 XLALPrintError(
"%s(): I/O error parsing %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
456 if(MetaioClose(&env)) {
458 XLALPrintError(
"%s(): error parsing document after %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
476 const char *row_head =
"\n\t\t\t";
482 XLALFilePuts(
"\t\t<Column Name=\"program\" Type=\"lstring\"/>\n", xml->
fp);
483 XLALFilePuts(
"\t\t<Column Name=\"version\" Type=\"lstring\"/>\n", xml->
fp);
484 XLALFilePuts(
"\t\t<Column Name=\"cvs_repository\" Type=\"lstring\"/>\n", xml->
fp);
485 XLALFilePuts(
"\t\t<Column Name=\"cvs_entry_time\" Type=\"int_4s\"/>\n", xml->
fp);
486 XLALFilePuts(
"\t\t<Column Name=\"comment\" Type=\"lstring\"/>\n", xml->
fp);
487 XLALFilePuts(
"\t\t<Column Name=\"is_online\" Type=\"int_4s\"/>\n", xml->
fp);
488 XLALFilePuts(
"\t\t<Column Name=\"node\" Type=\"lstring\"/>\n", xml->
fp);
489 XLALFilePuts(
"\t\t<Column Name=\"username\" Type=\"lstring\"/>\n", xml->
fp);
490 XLALFilePuts(
"\t\t<Column Name=\"unix_procid\" Type=\"int_4s\"/>\n", xml->
fp);
491 XLALFilePuts(
"\t\t<Column Name=\"start_time\" Type=\"int_4s\"/>\n", xml->
fp);
492 XLALFilePuts(
"\t\t<Column Name=\"end_time\" Type=\"int_4s\"/>\n", xml->
fp);
493 XLALFilePuts(
"\t\t<Column Name=\"jobid\" Type=\"int_4s\"/>\n", xml->
fp);
494 XLALFilePuts(
"\t\t<Column Name=\"domain\" Type=\"lstring\"/>\n", xml->
fp);
495 XLALFilePuts(
"\t\t<Column Name=\"ifos\" Type=\"lstring\"/>\n", xml->
fp);
496 XLALFilePuts(
"\t\t<Column Name=\"process_id\" Type=\"int_8s\"/>\n", xml->
fp);
497 XLALFilePuts(
"\t\t<Stream Name=\"process:table\" Type=\"Local\" Delimiter=\",\">", xml->
fp);
503 for(; process; process = process->
next) {
504 if(
XLALFilePrintf(xml->
fp,
"%s\"%s\",\"%s\",\"%s\",%d,\"%s\",%d,\"%s\",\"%s\",%d,%d,%d,%d,\"%s\",\"%s\",%ld",
523 row_head =
",\n\t\t\t";
int XLALLIGOLwFindColumn(struct MetaioParseEnvironment *env, const char *name, unsigned int type, int required)
Convenience wrapper for MetaioFindColumn(), translating to XLAL-style error reporting and printing us...
int XLALFilePuts(const char *s, LALFILE *file)
int XLALFilePrintf(LALFILE *file, const char *fmt,...)
void * XLALMalloc(size_t n)
INT4 XLALUTCToGPS(const struct tm *utc)
#define XLAL_ERROR_NULL(...)
int XLALGetBaseErrno(void)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSSet(LIGOTimeGPS *epoch, INT4 gpssec, INT8 gpsnan)
ProcessTable * XLALProcessTableFromLIGOLw(const char *filename)
Read the process table from a LIGO Light Weight XML file into a linked list of ProcessTable structure...
ProcessTable * XLALDestroyProcessTableRow(ProcessTable *row)
Destroy a ProcessTable structure.
ProcessTable * XLALCreateProcessTableRow(void)
Create a ProcessTable structure.
void XLALDestroyProcessTable(ProcessTable *head)
Destroy a ProcessTable linked list.
int XLALPopulateProcessTable(ProcessTable *ptable, const char *program_name, const char *cvs_revision, const char *cvs_source, const char *cvs_date, long process_id)
Populate a pre-allocated ProcessTable structure.
long XLALProcessTableGetNextID(ProcessTable *head)
Return the next available process ID.
int XLALCountProcessTable(ProcessTable *head)
Count and return the number of rows in the linked list.
int XLALWriteLIGOLwXMLProcessTable(LIGOLwXMLStream *xml, const ProcessTable *process)
Write a process table to an XML file.
static char * cvs_get_keyword_value(const char *cvs_string)
Parses a cvs keyword string in the form.
This structure contains the file stream and current table type for writing to LIGO lightweight XML fi...
CHAR domain[LIGOMETA_DOMAIN_MAX]
CHAR version[LIGOMETA_VERSION_MAX]
CHAR ifos[LIGOMETA_IFOS_MAX]
CHAR program[LIGOMETA_PROGRAM_MAX]
struct tagProcessTable * next
LIGOTimeGPS cvs_entry_time
CHAR node[LIGOMETA_NODE_MAX]
CHAR cvs_repository[LIGOMETA_CVS_REPOSITORY_MAX]
CHAR username[LIGOMETA_USERNAME_MAX]
CHAR comment[LIGOMETA_COMMENT_MAX]