Hi,
Attached find the list of Xpress tokens, and what they mean. Some of this
is figured out by taking there program apart, and others are from context.
I'll also include a very primitive program, for UNIX, that decodes the
headers in the datastream. The packet boundary marker is a 0xFF.
Karen and I are going to go to San Diago for a weekend sometime in the
Fall. We have a couple of frequent flyer tickets that will expire if we
don't use them by about September. Any interest in meeting us there?
See ya,
JIm
============================================================================
# MAIN MENU
N******* "News"
S******* "Sports"
W******* "Weather"
L******* "Lifestyles"
E******* "Entertainment"
T******* "Tech Talk"
M******* "Shopping"
I******* "Information on X*CHANGE"
X******* "Inside X*PRESS"
B******* "Business Wire"
F******* "Financial News"
# BUSINESS WIRE
B??AG*** "Canadian Press(CP): Business Report"
B??HS*** "McGraw-Hill News SNAPSHOT"
B??RB*** "BUSINESS-WIRE: Company PR W.R.T. Stock"
B??RP*** "PR Newswire"
B??SI*** "NYSE Standard and Poors Indices"
# ENTERTAINMENT
E??H**** "The Stars"
E??L**** "TV Schedules"
E??M**** "Movies, Books, and Music"
E??S**** "TV Scope"
E??W**** "What's happening"
# FINANCIAL NEWS
F??CC*** "Commodity Commentary"
F??CF*** "Weekly Farm Report"
F??CP*** "Commodity Prices"
F??F**** "Weekly Mutual Fund Commentary"
F??MC*** "Money Commentary"
F??ME*** "Foreign Exchange Rates"
F??MM*** "Interest and Money Rates"
F??MU*** "US Treasury Bills Rates"
F??O**** "Financial News Headlines"
F??Og*** "Selected Press Releases/Financial Reports"
F??Oi*** "Daily Insider Trading Report"
F??PMR** "Today's Interest Rates"
F??POC** "Market Statistics"
F??POM** "Just a Reminder!"
F??SA*** "Hourly Dow Jones Averages"
F??SC*** "New York Stock Market Commentary"
F??SD*** "Daily Dividends"
F??SR*** "Daily Most Active Stocks"
F??TIG** "Daily Gold and Silver Prices"
F??TM*** "Metals Prices"
# X*CHANGE INFORMATION
I??C**** "Computers and You"
I??I**** "Inside your Head"
I??P**** "Pot Shots"
I??R**** "Religion, Sex, and Politics"
I??S**** "Students, Teachers, and Parents"
I??T**** "Teen Talk"
I??U**** "Using Information X*Change"
I??W**** "The World Around You"
# LIFESTYLES
L??C**** "Careers"
L??E**** "Food"
L??F**** "Family Today"
L??H**** "Fitness & Fun"
L??M**** "Moneywise"
L??T**** "Trends & Events"
# SHOPPING
M??B**** "Best Buys"
M??Bg*** "Newsletter Samplers and Information"
M??F**** "Fleamarket"
M??S**** "Shopper's Showcase"
M??Sq*** "Online catalog"
M??T**** "Travel and Leisure"
M??Tl*** "Ski Area Snow Reports"
# NEWS
N??B**** "Business & Finance"
N??E**** "Opinions & Editorial"
NA****** "Headlines"
NA*C**** "AP Commentary"
NA*Ci*** "States News Service: Merger Information and Rumors"
NA*H**** "AP Headline Stories"
NA*N**** "AP News Story"
NC*H**** "Canada"
NC*N**** "CP Editorial"
NCEN**** "CP In Depth Story"
NI1***** "France"
NI3***** "Republic of China, Taiwan"
NI5***** "West Germany"
NI6***** "Japan"
NI7***** "Mexico"
NI8***** "Oil Exporting Countries"
NI9***** "Soviet Union"
NIA***** "Other International News"
NIB***** "People's Republic of China"
# SPORTS
S??H**** "Sports Headlines"
S??S**** "Sports General Schedules
S??T**** "Sports TV Schedules"
S??F**** "Pro Football"
S??F1*** "Pro Football News"
S??F2*** "Pro Football NFL News"
S??F3*** "Pro Football CFL News"
S??D**** "Pro Baseball"
S??D1*** "Pro Baseball News
S??D2*** "Pro Baseball Major League News"
S??D3*** "Pro Baseball Minor League News"
S??B**** "Pro Basketball"
S??P**** "Pro Hockey"
S??K**** "Pro Soccer"
S??G**** "Pro Golf and Tennis"
S??U**** "USA Collage Sports"
S??C**** "Canadian Sports"
S??M**** "Other Sports"
S??Q**** "Sports Quiz Questions"
S??A**** "Sports Quiz Answers"
# TECH TALK
T??A**** "Apple Technical News"
T??Ab*** "Apple Bulleten Board"
T??Bb*** "IBM PC and Clone Bulleten Board"
T??C**** "Commodore Technical News"
T??Cb*** "Commodore Bulleten Board"
T??I**** "IBM PC Technical News"
T??Ib*** "IBM PC Bulleten Board"
T??M**** "Other PC Technical News"
T??Mb*** "Other PCs Bulleten Board"
T??N**** "Technical News"
# WEATHE
WI****** "International Weather"
WN****** "USA National Weather"
WS****** "USA State Weather"
WC****** "Canadian National Weather"
WR****** "Canadian Regional Weather"
WSA***** "Alabama Weather
WSB***** "Alaska Weather"
WSC***** "Arizona Weather"
WSD***** "Arkansas Weather"
WSE***** "California Weather"
WSF***** "Colorado Weather"
WSG***** "Connecticut Weather"
WSH***** "Delaware Weather"
WSI***** "District of Columbia Weather"
WSJ***** "Florida Weather
WSK***** "Georgia Weather"
WSL***** "Hawaii Weather"
WSM***** "Idaho Weather"
WSN***** "Illinois Weather"
WSO***** "Indiana Weather"
WSP***** "Iowa Weather"
WSQ***** "Kansas Weather"
WSR***** "Kentucky Weather"
WSS***** "Louisiana Weather"
WST***** "Maine Weather"
WSU***** "Maryland Weather"
WSV***** "Massachusetts Weather"
WSW***** "Michigan Weather"
WSX***** "Minnesota Weather"
WSY***** "Mississippi Weather"
WSZ***** "Missouri Weather:
WSa***** "Montana Weather"
WSb***** "Nebraska Weather"
WSc***** "Nevada Weather"
WSd***** "New Hampshire Weather"
WSe***** "New Jersey Weather"
WSf***** "New Mexico Weather
WSg***** "New York Weather"
WSh***** "North Carolina Weather"
WSi***** "North Dakota Weather"
WSj***** "Ohio Weather"
WSk***** "Oklahoma Weather"
WSl***** "Oregon Weather"
WSm***** "Pennsylvania Weather"
WSn***** "Rhode Island Weather"
WSo***** "South Carolina Weather"
WSp***** "South Dakota Weather"
WSq***** "Tennessee Weather"
WSr***** "Texas Weather"
WSs***** "Utah Weather"
WSt***** "Vermont Weather
WSu***** "Virginia Weather"
WSv***** "Washington Weather"
WSw***** "West Virginia Weather"
WSx***** "Wisconsin Weather"
WSy***** "Wyoming Weather"
WR1***** "Alberta/North West Territories Canadain Regional Weather"
WR2***** "British Columbia Canadain Regional Weather"
WR3***** "Mantoba/Saskatchewan Canadain Regional Weather"
WR4***** "The Maritimes Canadain Regional Weather"
WR5***** "Newfoundland/Labrador Canadain Regional Weather"
WR6***** "Ontario/Great Lakes Canadain Regional Weather"
WR7***** "Quebec Canadain Regional Weather
WR8***** "Yukon Canadain Regional Weather
# INSIDE X*PRESS
X??B**** "X*Press Bulletins"
X??N**** "X*Press News"
X??P**** "X*Press New Services"
X??S**** "What to Watch for in X*Press"
X??T**** "X*Press User Tips"
============================================================================
This program runs against a data file that contains raw Xpress datastreams
If you can write a small PC program to read from the com line and write to
the file, you ought to be all set. Be sure to use the correct I/O routines
for DOS or you might find funny EOFs.
/* This program is designed to parse a large file of X*Press raw data */
/* into individual articles. These articles will then be output to */
/* stdout formated as best I can. The headers will, for sure, be right */
#include < stdio.h >
#include < fcntl.h >
#include < ctype.h >
#include < signal.h >
#include < time.h >
#include < errno.h >
#include < sys/termio.h >
#include < sys/tty.h >
#include < sys/types.h >
#include < sys/times.h >
/* Local defines */
#define SOH 0xFF /* Start Of Header for Link level */
#define LLHLEN 6 /* SOH,SEQ.low,SEQ.high,6 more bytes */
#define ARHLEN 23 /* Article header length */
#define ARMLEN 8 /* Article header minimum length */
/* Local global variables */
char *cats = "NSWLETMIXBF"
/* resync - This routine will read from the fd passed until it gets a SOH */
resync(fd)
FILE *fd; /* The file descriptor to read from */
{
int rc = 0x03; /* Init to something */
/* Loop through looking for SOH */
while (rc!=SOH)
{
rc = getc(fd); /* Read the next byte from file *
if (rc == EOF) /* Have we bumped into the end of file? */
{ /* YES - Ok,the program is done *
printf("***EOF***\n"); /* Say all done */
exit(0);
}
}
/* Put the SOH back on the stream and return */
if (EOF == ungetc(SOH,fd)) /* Try to put the SOH back */
{ /* It didn't work */
fprintf(stderr,"resync:Unable to place SOH back in stream\n");
exit(8);
}
return;
}
main(argc,argv)
int argc;
char *argv[];
{
FILE *fd; /* Used to open '/tmp/siolog' */
int i,j; /* Misc. guys */
unsigned short seq; /* The sequence number for stream */
int getseq = 1; /* Beginning sequence num must be set */
int isok; /* Flag set if article type is known */
int doprt; /* The print/noprint flag */
unsigned char data; /* The byte being checked */
unsigned char s_low,s_high; /* Sequence number low & high bytes */
unsigned int utmp,dtmp; /* Used for stuff likes equence numbers */
unsigned char LLHead[LLHLEN]; /* Link Layer Header */
unsigned char ARHead[ARHLEN]; /* Article header */
unsigned char outarray[17]; /* The output array we are building */
/* Replace # with * in the input parms for match */
if (argc > 1)
{
j = strlen(argv[1]);
for (i=0;i < j;i++)
if (argv[1][i] == '#')
argv[1][i] = '*';
els
if (argv[1][i] == '@')
argv[1][i] = '?';
}
/* Attempt to open the file and bomb if it's not there */
fd = fopen("/usr/spool/xpress","r");
if (!fd) /* Is the file available? */
{ /* NO - Ok, all done then */
fprintf(stderr,"main:Unable to open Xpress datastream file\n");
exit(8);
}
/* Before the main loop, try to sync on a SOH */
resync(fd); /* Get to beginning of article */
/* The main loop *
while (!feof(fd)) /* Loop until data exhausted */
{ /* We are at the beginning of stream */
if (SOH!=(data=getc(fd))) /* We should beat a SOH character */
{ /* Error out if we aren't */
fprintf(stderr,"main:Missing SOH for a new record\n");
exit(8);
}
/* Try to the the link layer sequence number */
s_low = getc(fd); /* Get the sequence number low byte */
s_high = getc(fd); /* and the high byte *
utmp = 256 * s_high + s_low; /* Make it into a real number */
if (feof(fd)) /* Did anything bad happen? *
{ /* Sometimes I get tired of error chking*/
printf("***EOF***\n"); /* If EOF,then all done */
exit(0)
/* Check the sequence number for a match *
if (getseq) /* Should we get the sequence number? */
{ /* YES - Ok, utmp contains seq# */
seq = utmp; /* Get the initial sequence number *
getseq = 0; /* Reset the flag that says we got it *
}
else
if (++seq != utmp) /* Check for a sequence number match *
{ /* I'll probably have to do more here...*/
dtmp = 100; /* See how far off we are? *
j = 0; /* Total number of trys */
while ((dtmp > 10) && (j < 10))
{
resync(fd); /* Find the next SOH */
getc(fd); /* Get the SOH, and ignore it */
s_low = getc(fd); /* Get the sequence number low byte *
s_high = getc(fd); /* and the high byte */
utmp = 256 * s_high + s_low;
if (feof(fd)) /* Did anything bad happen? *
{ /* Sometimes I get tired of error chking*/
printf("***EOF***\n"); /* If EOF,then all done *
exit(0)
}
dtmp = abs(utmp - seq); /* Find a new offset */
j++; /* Count this iteration */
if (j == 10) /* Did we get completely lost? *
printf("main: Expecting seq number %u, resynced to %u\n",seq,utmp);
els
if (seq != utmp) /* Did we find the one we wanted? */
{ /* Much stuff to do here *
if (abs(utmp - seq) > 10)
printf("main: Expecting seq=%u, resynced to seq=%u\n",seq,utmp)
seq = utmp;
}
}
/* Get the rest of the Link Level header */
for (i=0;i < LLHLEN;i++) /* Get the rest of link layer header *
{
j = getc(fd); /* Get a single character */
if (j == EOF) /* Did we run out of runway? */
{ /* YES - All done then? */
printf("***EOF***\n");
exit(0);
}
LLHead[i] = (unsigned char)j; /* Save the byte we just grabbed. *
/* Fill in the article header *
for (i=0;i < ARMLEN;i++) /* Get the minimum article header length*/
{ /* Try to move the header in *
j = getc(fd); /* Attempt to get a header byte */
if (j == EOF) /* Make sure we didn't EOF the sucker */
printf("***EOF***\n")
exit(0)
ARHead[i] = (unsigned char)j; /* The byte we just grabbed *
/* If the article ID token is known, get the rest of the header *
isok = strchr(cats,ARHead[0]) ? 1 : 0;
for (i=ARMLEN;i < ARHLEN;i++) /* Loop through the rest of the header */
if (isok) /* Is this a 'known' article? *
{ /* YES - Fill in the rest of the header */
j = getc(fd)
if (j == EOF
{
printf("***EOF***\n")
exit(0);
}
ARHead[i] = (unsigned char)j;
else /* NO - Lots more work to go */
ARHead[i] = 0x00; /* Just fill in empty header stuff */
/* Display the header information */
data = ARHead[ARMLEN]; /* Remember the first header byte *
ARHead[ARMLEN] = 0x00; /* Null terminate the type */
doprt = 1; /* Assume we print this one */
if (argc > 1)
if (strcmp(ARHead,argv[1])
doprt = 0; /* If we didn't match */
if (doprt
{
printf("%5.5u",seq); /* Start of header */
printf("%c ",(isok ? '>' : '}'));
for (i=0;i < LLHLEN;i++) /* Print every byte of header */
printf("%2.2X",LLHead[i])
printf(" %8.8s ",ARHead); /* Show article type */
ARHead[ARMLEN] = data; /* Restore article header byte *
if (isok && doprt) /* Do we know about this article type? */
{ /* YES - Decode and print header */
printf("%2.2X/%2.2X/%2.2X %2.2X:%2.2X:%2.2X.%2.2X "
ARHead[ARMLEN+1],ARHead[ARMLEN+2],ARHead[ARMLEN+0]
ARHead[ARMLEN+3],ARHead[ARMLEN+4],ARHead[ARMLEN+5]
ARHead[ARMLEN+6]);
for (i=ARMLEN+7;i < ARHLEN;i++
printf("%2.2X",ARHead[i]);
}
/* Scan the rest of the data in this article */
ARHead[8] = 0x00; /* Mark the end of the string */
data = SOH; /* Assume we don't print data */
j = 0; /* Number of bytes output so far */
if (argc > 1) /* Are there any arguments? *
if (!strcmp(argv[1],"ALL")) /* Do they want everything printed? *
data = 0x00; /* YES - We will display the whole thing*/
else /* Otherwise display only matches */
if (!strcmp(argv[1],ARHead))
data = 0x00
if ((data != SOH) && doprt) /* Do we need to finish the header? *
printf("\n"); /* YES - Do it */
while (data != SOH)
{ /* Loop through until eof or 1st SOH */
data = getc(fd); /* Get the next data byte */
if (data == EOF) /* Are we at the end of the line? */
{ /* YES - Easy to handle that then *
printf("***EOF***\n");
exit(0)
if (data == SOH) /* Have we picked up the SOH? *
{ /* Try to return it to the stream *
if (EOF == ungetc(SOH,fd)) /* Try to put the SOH back *
{ /* It didn't work *
fprintf(stderr,"resync:Unable to place SOH back in stream\n");
exit(8)
else
{ /* Ok, a good byte. Display it */
i = j % 16; /* Where are we in the line? */
outarray[i] = data; /* Get the data byte in outarray *
switch (i) /* There are enough formatting states */
case 15: /* The last byte on a line? */
printf(" %2.2X |",data);
for (i=0;i < 16;i++
printf("%c",(isprint(outarray[i])) ? outarray[i] : '.');
printf("|\n")
break;
case 0: /* The first byte on the line? */
printf(" %4.4X: %2.2X",j,data);
break;
case 8: /* Is it the middle byte? *
printf(":%2.2X",data);
break;
default
printf(" %2.2X",data);
break;
}
j++; /* Count another character read */
} /* else *
} /* while *
if (doprt) printf("\n")
resync(fd);
} /* while */
}