1 /*********************************************************************/
4 /* Updated: 3 June 1996 */
5 /* Organization: W/OSO242 - Graphics and Display Section */
9 /* This header file provides all function definitions necessary for */
10 /* the OSO242 C function library. */
12 /*********************************************************************/
14 #ifndef locallib_defined
15 #define locallib_defined
41 /********************/
42 /* Standard Defines */
43 /********************/
45 #define FALSE 0 /* boolean value */
46 #define MAXINT INT_MAX /* maximum integer */
47 #define MININT INT_MIN /* minimum integer */
48 #define MAXNEG INT_MIN /* minimum integer */
49 #define NO FALSE /* boolean value */
50 #define TRUE 1 /* boolean value */
51 #define TRUNCATED -1 /* indicates truncation */
52 #define YES TRUE /* boolean value */
59 #define ABS(x) (((x) < 0) ? -(x) : (x))
60 #define clearscrn system("CLRSCRN")
61 #define assgndev(d, v) v = 0x##d
62 #define DIM(a) (sizeof(a) / sizeof(a[0]))
63 #define FOREVER for(;;) /* endless loop */
64 #define getln(s, n) ((fgets(s, n, stdin)==NULL) ? EOF : strlen(s))
65 #define IMOD(i, j) (((i) % (j)) < 0 ? ((i) % (j))+(j) : ((i) % (j)))
66 #define IN_RANGE(n, lo, hi) ((lo) <= (n) && (n) <= (hi))
67 #define LOOPDN(r, n) for ((r) = (n)+1; --(r) > 0;)
68 #define MAX(x, y) (((x) < (y)) ? (y) : (x))
70 #define max(x, y) (((x) < (y)) ? (y) : (x))
72 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
74 #define min(x, y) (((x) < (y)) ? (x) : (y))
76 #define STREQ(s, t) (strcmp(s, t) == 0)
77 #define STRGT(s, t) (strcmp(s, t) > 0)
78 #define STRLT(s, t) (strcmp(s, t) < 0)
79 #define STRNEQ(s, t, l) (strncmp(s, t, l) == 0)
80 #define STRNGT(s, t, l) (strncmp(s, t, l) > 0)
81 #define STRNLT(s, t, l) (strncmp(s, t, l) < 0)
82 #define SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
85 /*********************************************************************/
87 /* Memory allocation debugging routines */
89 /*********************************************************************/
93 void *mallocx(size_t, char *, int);
94 void *callocx(size_t, size_t, char *, int);
95 void *reallocx(void *, size_t, char *, int);
96 void freex(void *, char *, int);
98 #define malloct(x) mallocx((x), __FILE__, __LINE__)
99 #define calloct(x, y) callocx((x), (y), __FILE__, __LINE__)
100 #define realloct(x, y) reallocx((x), (y), __FILE__, __LINE__)
101 #define freet(x) freex((x), __FILE__, __LINE__)
103 #define malloc malloct
104 #define calloc calloct
105 #define realloc realloct
112 /*********************************************************************/
114 /* General typedefs */
116 /*********************************************************************/
118 typedef unsigned char byte;
121 typedef unsigned short int bool;
124 typedef unsigned short int Devaddr;
126 typedef struct diskaddr {
133 typedef struct record_id {
136 time_t write_timestamp;
141 typedef struct location {
149 unsigned location_is_bsn:1,
157 /*********************************************************************/
158 /*********************************************************************/
161 /* Functions specific defines, typedefs, and structures */
164 /*********************************************************************/
165 /*********************************************************************/
169 /*********************************************************************/
171 /* Function prototype and structure(s) used in - */
173 /* bldstree - Build station information tree */
174 /* delstree - Delete station information tree */
175 /* getstinf - Get station information from tree */
177 /*********************************************************************/
179 typedef struct stn_info_node {
186 struct stn_info_node * right;
187 struct stn_info_node * left;
190 struct stn_info_node *bldstree(void);
191 void delstree(struct stn_info_node *);
192 struct stn_info_node *getstinf(struct stn_info_node *,
198 /*********************************************************************/
200 /* Function prototype and structure(s) used in - */
202 /* capqread - Read bulletins from CAPQ chain */
204 /*********************************************************************/
206 typedef struct CAPQ_data {
211 char * current_CAPQ_end_address;
215 char * bulletin_address;
228 struct CAPQ_data * capqread (char *, ...);
232 /*********************************************************************/
234 /* Function prototype and structure(s) used in - */
236 /* mdadread - Read bulletins from MDAD chain */
238 /*********************************************************************/
240 typedef struct MDAD_data {
245 char * current_MDAD_end_address;
249 char * bulletin_address;
269 MDADdata * mdadread (char *, ...);
271 MDADdata * mdadscan (char *, ...);
273 void mdadinpt ( MDADdata *, char, bool );
275 char * mdadnxtr ( void );
276 char * mdadnxtk ( void );
279 #define MDAD_HISTORY_LIMIT 39
282 struct MDAD_history_entry
285 unsigned short minute;
286 Diskaddr MDAD_chain_addr;
293 MDAD_History_Entry history_array[MDAD_HISTORY_LIMIT];
297 MDAD_History *mdadhist ( void );
300 /*********************************************************************/
302 /* Function prototype and structure(s) used in - */
304 /* gethdgi - Get bulletin heading information */
306 /*********************************************************************/
308 typedef struct bltn_heading_info {
316 // char TTAAii??(7??);
323 Abbrevhdg *gethdgi(char * );
327 /*********************************************************************/
329 /* Function prototype and structure(s) used in - */
331 /* getime - Get current system time */
332 /* suspend - Delay execution until specified minute boundary */
334 /*********************************************************************/
337 typedef struct tm_struct{
342 Stime *gettime(void);
343 int suspend(Stime *, int);
344 int timediff(Stime *, Stime *);
345 #define timecmp timediff
349 /*********************************************************************/
351 /* Function prototype and structure(s) used in - */
353 /* rdtaend - Specify rdtaread Ending Address */
354 /* rdtaread - Read From RGTR Data Tank */
355 /* rdtastrt - Specify rdtaread Starting Address */
356 /* rdtatend - Specify rdtaread End Time */
357 /* rdtatnke - Specify rdtaread Ending Address */
358 /* rdtarstr - Specify rdtaread Start Time */
360 /*********************************************************************/
362 typedef struct rgtrdata {
363 Diskaddr forward_chain;
364 Diskaddr bulletin_addr;
374 int rdtaend(char, Diskaddr *);
375 int rdtaread(RGTRdata *);
376 int rdtastrt(char, Diskaddr *);
377 int rdtatend (char, Stime *);
379 int rdtatstr(char, Stime *);
384 /*********************************************************************/
386 /* Typedefs and function prototypes for bulletin and report parsing */
389 /*********************************************************************/
393 typedef struct rptNode {
396 struct rptNode* next;
400 typedef struct synpBltn {
410 typedef struct shipBltn {
418 typedef struct tepiBltn {
426 typedef struct drftBltn {
434 typedef struct airpBltn {
442 typedef struct amdrBltn {
452 typedef struct bthyBltn {
460 typedef struct tescBltn {
468 typedef struct tracBltn {
476 typedef struct climBltn {
486 typedef struct clmtBltn {
496 typedef struct metBltn {
501 short int day; /* -1 indicates missing/invalid */
502 short int hour; /* -1 indicates missing/invalid */
503 short int min; /* -1 indicates missing/invalid */
507 typedef struct saoBltn {
515 typedef struct prBltn {
523 typedef struct tafBltn {
531 typedef struct metrRptP {
534 short int day; /* -1 indicates missing or invalid */
535 short int hour; /* -1 indicates missing or invalid */
536 short int min; /* -1 indicates missing or invalid */
541 typedef struct saoRptP {
544 short int hour; /* -1 indicates missing or invalid */
545 short int min; /* -1 indicates missing or invalid */
550 typedef struct prRptP {
553 short int hour; /* -1 indicates missing or invalid */
554 short int min; /* -1 indicates missing or invalid */
559 typedef struct tafRptP {
564 short int validPeriod;
571 typedef struct synpRptP {
579 typedef struct climRptP {
587 typedef struct clmtRptP {
595 typedef struct tepiRptP {
602 short int ulongitude;
614 SynpBltn *pbsynp(char *);
615 ShipBltn *pbship(char *);
616 TePiBltn *pbtepi(char *);
617 DrftBltn *pbdrft(char *);
618 AirpBltn *pbairp(char *);
619 AmdrBltn *pbamdr(char *);
620 BthyBltn *pbbthy(char *);
621 TescBltn *pbtesc(char *);
622 TracBltn *pbtrac(char *);
623 ClimBltn *pbclim(char *);
624 ClmtBltn *pbclmt(char *);
625 MetBltn *pbmetr(char *);
626 MetBltn *pbspec(char *);
627 TafBltn *pbtaf(char *);
628 SAOBltn *pbsao(char *);
629 PRBltn *pbpirep(char *);
631 SynpRptP *prpsynp(char *, int);
632 TePiRptP *prptepi(char *, int);
633 ClimRptP *prpclim(char *, int);
634 ClmtRptP *prpclmt(char *, int);
635 MetrRptP *prpmetr(char *, int);
636 TafRptP *prptaf(char *, int);
637 SAORptP *prpsao(char *, int);
638 PRRptP *prppirep(char *, int);
643 /*********************************************************************/
645 /* Structures and Function Prototypes for RRN physical I/O */
647 /*********************************************************************/
650 typedef struct RRN_device {
655 unsigned short dev_addr,
669 bool readrrn(char *device_name,
672 unsigned int read_count);
674 bool writerrn(char *device_name,
677 unsigned int write_count);
679 RRN_Device *devinfo(char *device_name);
681 bool valid_dn(char *device_name);
685 /*********************************************************************/
687 /* Function prototype for string value test functions. */
689 /*********************************************************************/
692 int sisalnum(char *);
693 int sisalpha(char *);
694 int siscntrl(char *);
695 int sisdigit(char *);
696 int sisgraph(char *);
697 int sislower(char *);
698 int sisprint(char *);
699 int sispunct(char *);
700 int sisspace(char *);
701 int sisupper(char *);
702 int sisxdigi(char *);
704 int nisalnum(char *, int);
705 int nisalpha(char *, int);
706 int niscntrl(char *, int);
707 int nisdigit(char *, int);
708 int nisgraph(char *, int);
709 int nislower(char *, int);
710 int nisprint(char *, int);
711 int nispunct(char *, int);
712 int nisspace(char *, int);
713 int nisupper(char *, int);
714 int nisxdigi(char *, int);
716 char *nxtalnum(char *);
717 char *nxtalpha(char *);
718 char *nxtcntrl(char *);
719 char *nxtdigit(char *);
720 char *nxtgraph(char *);
721 char *nxtlower(char *);
722 char *nxtprint(char *);
723 char *nxtpunct(char *);
724 char *nxtspace(char *);
725 char *nxtupper(char *);
726 char *nxtxdigi(char *);
728 char *lstalnum(char *, int);
729 char *lstalpha(char *, int);
730 char *lstcntrl(char *, int);
731 char *lstdigit(char *, int);
732 char *lstgraph(char *, int);
733 char *lstlower(char *, int);
734 char *lstprint(char *, int);
735 char *lstpunct(char *, int);
736 char *lstspace(char *, int);
737 char *lstupper(char *, int);
738 char *lstxdigi(char *, int);
741 /*********************************************************************/
743 /* Enumeration type and declaration for code form identification */
746 /*********************************************************************/
750 enum codeform {AIREP, AMDAR, ARFOR, ARMET, BATHY, CLIMAT, CLIMAT_SHIP,
751 CLIMAT_TEMP, CLIMAT_TEMP_SHIP, CODAR, DRIFTER, FC,
752 HYFOR, IAC, IAC_FLEET, ICEAN, METAR, PILOT, PILOT_MOBILE,
753 PILOT_SHIP, RECCO, ROCOB, ROCOB_SHIP, ROFOR, SAO, PIREP,
754 SATEM, SATOB, SHIP, SPECI, SYNOP, TAF, TEMP, TEMP_DROP,
755 TEMP_MOBILE, TEMP_SHIP, TESAC, TRACKOB, WAVEOB,
756 UNKNOWN_FORM, TEMP_A, TEMP_B, TEMP_C, TEMP_D,
757 TEMP_DROP_A, TEMP_DROP_B, TEMP_DROP_C, TEMP_DROP_D,
758 TEMP_MOBILE_A, TEMP_MOBILE_B, TEMP_MOBILE_C,
759 TEMP_MOBILE_D, TEMP_SHIP_A, TEMP_SHIP_B, TEMP_SHIP_C,
760 TEMP_SHIP_D, PILOT_A, PILOT_B, PILOT_C, PILOT_D,
761 PILOT_MOBILE_A, PILOT_MOBILE_B, PILOT_MOBILE_C,
762 PILOT_MOBILE_D, PILOT_SHIP_A, PILOT_SHIP_B,
763 PILOT_SHIP_C, PILOT_SHIP_D }
766 CodeForm idcode(char *);
768 char *codename(CodeForm);
769 CodeForm name2cf ( char * );
773 /*********************************************************************/
775 /* String manipulation functions */
777 /*********************************************************************/
780 char *strnlf(char *, size_t);
781 char *strnmid(char *, size_t, size_t);
782 char *strnrt(char *, size_t);
783 char *strrstr(char *, char *);
784 char *strcentr(char *, size_t);
785 char *strdel(char *, char *, size_t);
786 char *strins(char *, char *, char *);
787 char *strljust(char * , size_t);
788 char *strltrim(char *, char *);
789 char *strmrplc(char *, char *, char *);
790 char *strocat(char *, char *);
791 char *strrpt(char *, char *, size_t);
792 char *strrjust(char *, size_t);
793 char *strrplc(char * , char *, char *);
794 char *strrtrim(char * , char *);
795 char *strtrim(char *, char *);
796 char *strvcat(char *, char *, ...);
800 /*********************************************************************/
802 /* Bulletin Generator declarations */
804 /*********************************************************************/
806 typedef bool (*ParseBltnFnPtr) ( char *bltn,
815 void cbltngen ( ParseBltnFnPtr fnPtr,
817 Devaddr *historyDevice,
818 Diskaddr *historyAddr,
819 unsigned * bltnInCountPtr,
820 unsigned * bltnOutCountPtr,
821 unsigned * rptOutCountPtr );
823 void tbltngen ( ParseBltnFnPtr fnPtr,
825 Devaddr *historyDevice,
826 Diskaddr *historyAddr,
827 unsigned * bltnInCountPtr,
828 unsigned * bltnOutCountPtr,
829 unsigned * rptOutCountPtr );
832 typedef bool (*ParseBltnFnPtrX) ( char *bltn,
842 void xbltngen ( ParseBltnFnPtrX fnPtr,
844 Devaddr *historyDevice,
845 Diskaddr *historyAddr,
846 unsigned * bltnInCountPtr,
847 unsigned * bltnOutCountPtr,
848 unsigned * rptOutCountPtr );
850 void dbltngen ( ParseBltnFnPtrX fnPtr,
852 Devaddr *historyDevice,
853 Diskaddr *historyAddr,
854 unsigned * bltnInCountPtr,
855 unsigned * bltnOutCountPtr,
856 unsigned * rptOutCountPtr );
858 typedef bool (*OParseBltnFnPtr) ( char *bltn,
868 void obltngen ( OParseBltnFnPtr fnPtr,
870 Devaddr *historyDevice,
871 Diskaddr *historyAddr,
872 unsigned * bltnInCountPtr,
873 unsigned * bltnOutCountPtr,
874 unsigned * rptOutCountPtr );
877 void pbltngen ( OParseBltnFnPtr fnPtr,
879 Devaddr *historyDevice,
880 Diskaddr *historyAddr,
881 unsigned * bltnInCountPtr,
882 unsigned * bltnOutCountPtr,
883 unsigned * rptOutCountPtr );
887 /*********************************************************************/
889 /* Typedefs and function prototypes for retrieving information from */
890 /* switching directory. */
892 /*********************************************************************/
894 typedef struct bltn_history{
895 Diskaddr bltn_disk_addr;
896 unsigned short bltn_start_offset;
897 unsigned short bltn_record_count;
898 unsigned short bltn_end_offset;
899 time_t bltn_time_recvd;
903 typedef struct sw_dir_info_rec {
908 short int recvd_line;
913 short int domestic_cat_num;
917 short int output_line_count;
918 unsigned short trans_line[128];
921 Diskaddr history_file_addr;
922 BltnHistory bltn_history[4];
925 SwDirInfo *rtswdir(char *, int);
926 SwDirInfo *rtpswdir(void);
927 SwDirInfo *rtnswdir(void);
933 /*********************************************************************/
935 /* General local functions */
937 /*********************************************************************/
940 int itoc(int, char *, int);
942 int antoi(char *, int);
944 float antof(char *, int);
946 void errmsg(char *, ...);
948 void logmsg(char *, ...);
950 void opermsg(char *, ...);
952 int lmsg(const char *, const char *, ...);
953 int emsg(const char *, const char *, ...);
954 int omsg(const char *, const char *, ...);
956 //#pragma linkage(ASCTOEB, OS)
957 void ASCTOEB(char *, int);
959 //#pragma linkage(EAXLATE, OS)
960 void EAXLATE(char *, int);
962 //#pragma linkage(PASCTOEB, OS)
963 void PASCTOEB(char *, int);
965 char **bldhdarr(char *);
967 void dalchdar(char **);
969 //#pragma linkage(CCAPREAD, OS)
970 void *CCAPREAD(char *, int);
972 //#pragma linkage(CCAPWRIT, OS)
973 void CCAPWRIT(char *, char *, int);
975 //#pragma linkage(PPTOI, OS)
980 int diffmin(int, int, int, int, int, int);
984 void nextdate(int *, int *, int *);
986 void prevdate(int *, int *, int *);
988 void rdstaddr(char *, char *);
990 int wrenaddr(char *, char *);
992 int vfydigit (char *, int);
994 int readline(char * , int);
996 int prevjul(int, int);
998 int nextjul(int, int);
1000 int fcomppos(fpos_t *, fpos_t *);
1002 void lfprint(char *);
1004 void flfprint(FILE *, char *);
1006 void slfprint(char *, int, char *);
1008 void flfnprnt(FILE *, char *, int);
1010 void slfnprnt(char *, int, char *, int);
1012 int strhash(char *);
1014 void reverse(char *);
1016 //bool itoa(int, char *, int);
1018 int getsnn(char * , int);
1020 int fgetsnn(char *, int, FILE *);
1022 int getreply(char *, char *, int);
1024 bool strfit(char *, char *, size_t);
1026 bool addrfrm3(char *, Diskaddr *);
1028 bool addrfrm5(char *, Diskaddr *);
1030 bool addrto3(Diskaddr *, char *);
1032 bool addrto5(Diskaddr *, char *);
1034 int addrcmp(Diskaddr *, Diskaddr *);
1036 void incraddr(Diskaddr *, Diskaddr *, Diskaddr *);
1037 void decraddr(Diskaddr *, Diskaddr *, Diskaddr *);
1039 //#pragma linkage(readrec, OS)
1040 char *readrec(Diskaddr *, Devaddr *, int, void *);
1042 //#pragma linkage(writerec, OS)
1043 int writerec(Diskaddr*, Devaddr *, int, void *);
1045 char prhold(char *, ...);
1047 void dump(char *, int);
1049 void fdump(FILE *, char *, int);
1051 void fwdump(FILE *, char *, int);
1053 //char toascii(char);
1055 char *strtoas(char *);
1057 char *strntoas(char *, int);
1059 char toebcdic(char);
1061 char *strtoeb(char *);
1063 char *strntoeb(char *, int);
1065 char *lfind(char *, char *, int, int, int(*)(char *, char *));
1067 char *lsearch(char *, char *, int *, int, int(*)(char *, char *));
1069 bool strcmpw(char *, char *);
1071 int strccnt(char *, int);
1073 int strnccnt(char *, int, size_t);
1075 int pprt(FILE *, char *, char *, char *, char *, ...);
1077 bool pprtbrk(FILE *, char *, char *, char *);
1079 bool pprtend(FILE *, char *);
1081 bool pprtinit(int, char, char *, char *, char *);
1083 char *monthnam(int, char);
1085 char *getrec(FILE *, int, char *);
1087 bool jtog(int, int, int *, int *, int *);
1089 bool gtoj(int, int, int, int *, int *);
1091 bool ccap2std(char *, Devaddr *, Diskaddr *);
1093 bool std2ccap(Devaddr *, Diskaddr *, char *);
1095 char *strupr(char *);
1096 char *strlwr(char *);
1097 //char *strdup(char *);
1098 //int strcmpi(char *, char *);
1100 //void *memccpy(void *, void *, int, unsigned);
1102 char *rptstrip(char *);
1103 char *rptfmt(char *);
1104 char *rptfmti(char *, unsigned short int);
1106 char *strnstr(char *, char *, size_t);
1109 int ccregion(char *);
1112 void *memrchr(const void *, int, size_t);
1114 bool sysmonms(char *, char *, ...);
1115 bool sysmoncl(char *);
1117 short prevndx ( short max, short min, short current );
1118 short nextndx ( short max, short min, short current );
1120 time_t extrym ( unsigned day, unsigned hour, unsigned minute );
1121 time_t extrymd ( unsigned hour, unsigned minute );
1123 int cmptimet ( time_t t1, time_t t2 );
1125 int tfprintf ( FILE *, const char *, ... );
1127 bool purgelog ( char *filename, unsigned short delete_age );
1129 time_t odbtime ( void );
1131 int bltnpcnt ( char *, int );
1132 void bltnpage ( char *, int, int );
1134 void rot( char *, unsigned int );
1135 void unrot( char *, unsigned int );
1137 void encrypt( char *, char * );
1138 void decrypt( char *, char * );
1140 int HEXTOI( char *, int );
1142 char **hdgxref( char * );
1144 struct tm *zonetime( unsigned short, unsigned short, char );
1146 int wordcnt( char * );
1147 int wordcntn( char *, unsigned int );
1149 char *word( char *, unsigned int );
1150 char *wordn( char *, unsigned int, unsigned int );
1152 char *crlfstrp( char * );
1154 bool charcmp( char *, char * );
1156 int linecnt( char * );
1157 int linecntn( char *, unsigned int );
1159 char *bltline( char *, unsigned int );
1160 char *bltlinen( char *, unsigned int, unsigned int );
1162 char *pttoline( char *, unsigned int );
1163 char *pttoword( char *, unsigned int );
1165 char *moblrgn(unsigned short,
1169 char *nxtgroup( char * );