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;)
69 # define MAX(x, y) (((x) < (y)) ? (y) : (x))
72 # define max(x, y) (((x) < (y)) ? (y) : (x))
75 # define MIN(x, y) (((x) < (y)) ? (x) : (y))
78 # define min(x, y) (((x) < (y)) ? (x) : (y))
80 #define STREQ(s, t) (strcmp(s, t) == 0)
81 #define STRGT(s, t) (strcmp(s, t) > 0)
82 #define STRLT(s, t) (strcmp(s, t) < 0)
83 #define STRNEQ(s, t, l) (strncmp(s, t, l) == 0)
84 #define STRNGT(s, t, l) (strncmp(s, t, l) > 0)
85 #define STRNLT(s, t, l) (strncmp(s, t, l) < 0)
86 #define SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
89 /*********************************************************************/
91 /* Memory allocation debugging routines */
93 /*********************************************************************/
97 void *mallocx(size_t, char *, int);
98 void *callocx(size_t, size_t, char *, int);
99 void *reallocx(void *, size_t, char *, int);
100 void freex(void *, char *, int);
102 #define malloct(x) mallocx((x), __FILE__, __LINE__)
103 #define calloct(x, y) callocx((x), (y), __FILE__, __LINE__)
104 #define realloct(x, y) reallocx((x), (y), __FILE__, __LINE__)
105 #define freet(x) freex((x), __FILE__, __LINE__)
107 #define malloc malloct
108 #define calloc calloct
109 #define realloc realloct
116 /*********************************************************************/
118 /* General typedefs */
120 /*********************************************************************/
122 typedef unsigned char byte;
125 typedef unsigned short int bool;
128 typedef unsigned short int Devaddr;
130 typedef struct diskaddr {
137 typedef struct record_id {
140 time_t write_timestamp;
145 typedef struct location {
153 unsigned location_is_bsn:1,
161 /*********************************************************************/
162 /*********************************************************************/
165 /* Functions specific defines, typedefs, and structures */
168 /*********************************************************************/
169 /*********************************************************************/
173 /*********************************************************************/
175 /* Function prototype and structure(s) used in - */
177 /* bldstree - Build station information tree */
178 /* delstree - Delete station information tree */
179 /* getstinf - Get station information from tree */
181 /*********************************************************************/
183 typedef struct stn_info_node {
190 struct stn_info_node * right;
191 struct stn_info_node * left;
194 struct stn_info_node *bldstree(void);
195 void delstree(struct stn_info_node *);
196 struct stn_info_node *getstinf(struct stn_info_node *,
202 /*********************************************************************/
204 /* Function prototype and structure(s) used in - */
206 /* capqread - Read bulletins from CAPQ chain */
208 /*********************************************************************/
210 typedef struct CAPQ_data {
215 char * current_CAPQ_end_address;
219 char * bulletin_address;
232 struct CAPQ_data * capqread (char *, ...);
236 /*********************************************************************/
238 /* Function prototype and structure(s) used in - */
240 /* mdadread - Read bulletins from MDAD chain */
242 /*********************************************************************/
244 typedef struct MDAD_data {
249 char * current_MDAD_end_address;
253 char * bulletin_address;
273 MDADdata * mdadread (char *, ...);
275 MDADdata * mdadscan (char *, ...);
277 void mdadinpt ( MDADdata *, char, bool );
279 char * mdadnxtr ( void );
280 char * mdadnxtk ( void );
283 #define MDAD_HISTORY_LIMIT 39
286 struct MDAD_history_entry
289 unsigned short minute;
290 Diskaddr MDAD_chain_addr;
297 MDAD_History_Entry history_array[MDAD_HISTORY_LIMIT];
301 MDAD_History *mdadhist ( void );
304 /*********************************************************************/
306 /* Function prototype and structure(s) used in - */
308 /* gethdgi - Get bulletin heading information */
310 /*********************************************************************/
312 typedef struct bltn_heading_info {
320 // char TTAAii??(7??);
327 Abbrevhdg *gethdgi(char * );
331 /*********************************************************************/
333 /* Function prototype and structure(s) used in - */
335 /* getime - Get current system time */
336 /* suspend - Delay execution until specified minute boundary */
338 /*********************************************************************/
341 typedef struct tm_struct{
346 Stime *gettime(void);
347 int suspend(Stime *, int);
348 int timediff(Stime *, Stime *);
349 #define timecmp timediff
353 /*********************************************************************/
355 /* Function prototype and structure(s) used in - */
357 /* rdtaend - Specify rdtaread Ending Address */
358 /* rdtaread - Read From RGTR Data Tank */
359 /* rdtastrt - Specify rdtaread Starting Address */
360 /* rdtatend - Specify rdtaread End Time */
361 /* rdtatnke - Specify rdtaread Ending Address */
362 /* rdtarstr - Specify rdtaread Start Time */
364 /*********************************************************************/
366 typedef struct rgtrdata {
367 Diskaddr forward_chain;
368 Diskaddr bulletin_addr;
378 int rdtaend(char, Diskaddr *);
379 int rdtaread(RGTRdata *);
380 int rdtastrt(char, Diskaddr *);
381 int rdtatend (char, Stime *);
383 int rdtatstr(char, Stime *);
388 /*********************************************************************/
390 /* Typedefs and function prototypes for bulletin and report parsing */
393 /*********************************************************************/
397 typedef struct rptNode {
400 struct rptNode* next;
404 typedef struct synpBltn {
414 typedef struct shipBltn {
422 typedef struct tepiBltn {
430 typedef struct drftBltn {
438 typedef struct airpBltn {
446 typedef struct amdrBltn {
456 typedef struct bthyBltn {
464 typedef struct tescBltn {
472 typedef struct tracBltn {
480 typedef struct climBltn {
490 typedef struct clmtBltn {
500 typedef struct metBltn {
505 short int day; /* -1 indicates missing/invalid */
506 short int hour; /* -1 indicates missing/invalid */
507 short int min; /* -1 indicates missing/invalid */
511 typedef struct saoBltn {
519 typedef struct prBltn {
527 typedef struct tafBltn {
535 typedef struct metrRptP {
538 short int day; /* -1 indicates missing or invalid */
539 short int hour; /* -1 indicates missing or invalid */
540 short int min; /* -1 indicates missing or invalid */
545 typedef struct saoRptP {
548 short int hour; /* -1 indicates missing or invalid */
549 short int min; /* -1 indicates missing or invalid */
554 typedef struct prRptP {
557 short int hour; /* -1 indicates missing or invalid */
558 short int min; /* -1 indicates missing or invalid */
563 typedef struct tafRptP {
568 short int validPeriod;
575 typedef struct synpRptP {
583 typedef struct climRptP {
591 typedef struct clmtRptP {
599 typedef struct tepiRptP {
606 short int ulongitude;
618 SynpBltn *pbsynp(char *);
619 ShipBltn *pbship(char *);
620 TePiBltn *pbtepi(char *);
621 DrftBltn *pbdrft(char *);
622 AirpBltn *pbairp(char *);
623 AmdrBltn *pbamdr(char *);
624 BthyBltn *pbbthy(char *);
625 TescBltn *pbtesc(char *);
626 TracBltn *pbtrac(char *);
627 ClimBltn *pbclim(char *);
628 ClmtBltn *pbclmt(char *);
629 MetBltn *pbmetr(char *);
630 MetBltn *pbspec(char *);
631 TafBltn *pbtaf(char *);
632 SAOBltn *pbsao(char *);
633 PRBltn *pbpirep(char *);
635 SynpRptP *prpsynp(char *, int);
636 TePiRptP *prptepi(char *, int);
637 ClimRptP *prpclim(char *, int);
638 ClmtRptP *prpclmt(char *, int);
639 MetrRptP *prpmetr(char *, int);
640 TafRptP *prptaf(char *, int);
641 SAORptP *prpsao(char *, int);
642 PRRptP *prppirep(char *, int);
647 /*********************************************************************/
649 /* Structures and Function Prototypes for RRN physical I/O */
651 /*********************************************************************/
654 typedef struct RRN_device {
659 unsigned short dev_addr,
673 bool readrrn(char *device_name,
676 unsigned int read_count);
678 bool writerrn(char *device_name,
681 unsigned int write_count);
683 RRN_Device *devinfo(char *device_name);
685 bool valid_dn(char *device_name);
689 /*********************************************************************/
691 /* Function prototype for string value test functions. */
693 /*********************************************************************/
696 int sisalnum(char *);
697 int sisalpha(char *);
698 int siscntrl(char *);
699 int sisdigit(char *);
700 int sisgraph(char *);
701 int sislower(char *);
702 int sisprint(char *);
703 int sispunct(char *);
704 int sisspace(char *);
705 int sisupper(char *);
706 int sisxdigi(char *);
708 int nisalnum(char *, int);
709 int nisalpha(char *, int);
710 int niscntrl(char *, int);
711 int nisdigit(char *, int);
712 int nisgraph(char *, int);
713 int nislower(char *, int);
714 int nisprint(char *, int);
715 int nispunct(char *, int);
716 int nisspace(char *, int);
717 int nisupper(char *, int);
718 int nisxdigi(char *, int);
720 char *nxtalnum(char *);
721 char *nxtalpha(char *);
722 char *nxtcntrl(char *);
723 char *nxtdigit(char *);
724 char *nxtgraph(char *);
725 char *nxtlower(char *);
726 char *nxtprint(char *);
727 char *nxtpunct(char *);
728 char *nxtspace(char *);
729 char *nxtupper(char *);
730 char *nxtxdigi(char *);
732 char *lstalnum(char *, int);
733 char *lstalpha(char *, int);
734 char *lstcntrl(char *, int);
735 char *lstdigit(char *, int);
736 char *lstgraph(char *, int);
737 char *lstlower(char *, int);
738 char *lstprint(char *, int);
739 char *lstpunct(char *, int);
740 char *lstspace(char *, int);
741 char *lstupper(char *, int);
742 char *lstxdigi(char *, int);
745 /*********************************************************************/
747 /* Enumeration type and declaration for code form identification */
750 /*********************************************************************/
754 enum codeform {AIREP, AMDAR, ARFOR, ARMET, BATHY, CLIMAT, CLIMAT_SHIP,
755 CLIMAT_TEMP, CLIMAT_TEMP_SHIP, CODAR, DRIFTER, FC,
756 HYFOR, IAC, IAC_FLEET, ICEAN, METAR, PILOT, PILOT_MOBILE,
757 PILOT_SHIP, RECCO, ROCOB, ROCOB_SHIP, ROFOR, SAO, PIREP,
758 SATEM, SATOB, SHIP, SPECI, SYNOP, TAF, TEMP, TEMP_DROP,
759 TEMP_MOBILE, TEMP_SHIP, TESAC, TRACKOB, WAVEOB,
760 UNKNOWN_FORM, TEMP_A, TEMP_B, TEMP_C, TEMP_D,
761 TEMP_DROP_A, TEMP_DROP_B, TEMP_DROP_C, TEMP_DROP_D,
762 TEMP_MOBILE_A, TEMP_MOBILE_B, TEMP_MOBILE_C,
763 TEMP_MOBILE_D, TEMP_SHIP_A, TEMP_SHIP_B, TEMP_SHIP_C,
764 TEMP_SHIP_D, PILOT_A, PILOT_B, PILOT_C, PILOT_D,
765 PILOT_MOBILE_A, PILOT_MOBILE_B, PILOT_MOBILE_C,
766 PILOT_MOBILE_D, PILOT_SHIP_A, PILOT_SHIP_B,
767 PILOT_SHIP_C, PILOT_SHIP_D }
770 CodeForm idcode(char *);
772 char *codename(CodeForm);
773 CodeForm name2cf ( char * );
777 /*********************************************************************/
779 /* String manipulation functions */
781 /*********************************************************************/
784 char *strnlf(char *, size_t);
785 char *strnmid(char *, size_t, size_t);
786 char *strnrt(char *, size_t);
787 char *strrstr(char *, char *);
788 char *strcentr(char *, size_t);
789 char *strdel(char *, char *, size_t);
790 char *strins(char *, char *, char *);
791 char *strljust(char * , size_t);
792 char *strltrim(char *, char *);
793 char *strmrplc(char *, char *, char *);
794 char *strocat(char *, char *);
795 char *strrpt(char *, char *, size_t);
796 char *strrjust(char *, size_t);
797 char *strrplc(char * , char *, char *);
798 char *strrtrim(char * , char *);
799 char *strtrim(char *, char *);
800 char *strvcat(char *, char *, ...);
804 /*********************************************************************/
806 /* Bulletin Generator declarations */
808 /*********************************************************************/
810 typedef bool (*ParseBltnFnPtr) ( char *bltn,
819 void cbltngen ( ParseBltnFnPtr fnPtr,
821 Devaddr *historyDevice,
822 Diskaddr *historyAddr,
823 unsigned * bltnInCountPtr,
824 unsigned * bltnOutCountPtr,
825 unsigned * rptOutCountPtr );
827 void tbltngen ( ParseBltnFnPtr fnPtr,
829 Devaddr *historyDevice,
830 Diskaddr *historyAddr,
831 unsigned * bltnInCountPtr,
832 unsigned * bltnOutCountPtr,
833 unsigned * rptOutCountPtr );
836 typedef bool (*ParseBltnFnPtrX) ( char *bltn,
846 void xbltngen ( ParseBltnFnPtrX fnPtr,
848 Devaddr *historyDevice,
849 Diskaddr *historyAddr,
850 unsigned * bltnInCountPtr,
851 unsigned * bltnOutCountPtr,
852 unsigned * rptOutCountPtr );
854 void dbltngen ( ParseBltnFnPtrX fnPtr,
856 Devaddr *historyDevice,
857 Diskaddr *historyAddr,
858 unsigned * bltnInCountPtr,
859 unsigned * bltnOutCountPtr,
860 unsigned * rptOutCountPtr );
862 typedef bool (*OParseBltnFnPtr) ( char *bltn,
872 void obltngen ( OParseBltnFnPtr fnPtr,
874 Devaddr *historyDevice,
875 Diskaddr *historyAddr,
876 unsigned * bltnInCountPtr,
877 unsigned * bltnOutCountPtr,
878 unsigned * rptOutCountPtr );
881 void pbltngen ( OParseBltnFnPtr fnPtr,
883 Devaddr *historyDevice,
884 Diskaddr *historyAddr,
885 unsigned * bltnInCountPtr,
886 unsigned * bltnOutCountPtr,
887 unsigned * rptOutCountPtr );
891 /*********************************************************************/
893 /* Typedefs and function prototypes for retrieving information from */
894 /* switching directory. */
896 /*********************************************************************/
898 typedef struct bltn_history{
899 Diskaddr bltn_disk_addr;
900 unsigned short bltn_start_offset;
901 unsigned short bltn_record_count;
902 unsigned short bltn_end_offset;
903 time_t bltn_time_recvd;
907 typedef struct sw_dir_info_rec {
912 short int recvd_line;
917 short int domestic_cat_num;
921 short int output_line_count;
922 unsigned short trans_line[128];
925 Diskaddr history_file_addr;
926 BltnHistory bltn_history[4];
929 SwDirInfo *rtswdir(char *, int);
930 SwDirInfo *rtpswdir(void);
931 SwDirInfo *rtnswdir(void);
937 /*********************************************************************/
939 /* General local functions */
941 /*********************************************************************/
944 int itoc(int, char *, int);
946 int antoi(char *, int);
948 float antof(char *, int);
950 void errmsg(char *, ...);
952 void logmsg(char *, ...);
954 void opermsg(char *, ...);
956 int lmsg(const char *, const char *, ...);
957 int emsg(const char *, const char *, ...);
958 int omsg(const char *, const char *, ...);
960 //#pragma linkage(ASCTOEB, OS)
961 void ASCTOEB(char *, int);
963 //#pragma linkage(EAXLATE, OS)
964 void EAXLATE(char *, int);
966 //#pragma linkage(PASCTOEB, OS)
967 void PASCTOEB(char *, int);
969 char **bldhdarr(char *);
971 void dalchdar(char **);
973 //#pragma linkage(CCAPREAD, OS)
974 void *CCAPREAD(char *, int);
976 //#pragma linkage(CCAPWRIT, OS)
977 void CCAPWRIT(char *, char *, int);
979 //#pragma linkage(PPTOI, OS)
984 int diffmin(int, int, int, int, int, int);
988 void nextdate(int *, int *, int *);
990 void prevdate(int *, int *, int *);
992 void rdstaddr(char *, char *);
994 int wrenaddr(char *, char *);
996 int vfydigit (char *, int);
998 int readline(char * , int);
1000 int prevjul(int, int);
1002 int nextjul(int, int);
1004 int fcomppos(fpos_t *, fpos_t *);
1006 void lfprint(char *);
1008 void flfprint(FILE *, char *);
1010 void slfprint(char *, int, char *);
1012 void flfnprnt(FILE *, char *, int);
1014 void slfnprnt(char *, int, char *, int);
1016 int strhash(char *);
1018 void reverse(char *);
1020 //bool itoa(int, char *, int);
1022 int getsnn(char * , int);
1024 int fgetsnn(char *, int, FILE *);
1026 int getreply(char *, char *, int);
1028 bool strfit(char *, char *, size_t);
1030 bool addrfrm3(char *, Diskaddr *);
1032 bool addrfrm5(char *, Diskaddr *);
1034 bool addrto3(Diskaddr *, char *);
1036 bool addrto5(Diskaddr *, char *);
1038 int addrcmp(Diskaddr *, Diskaddr *);
1040 void incraddr(Diskaddr *, Diskaddr *, Diskaddr *);
1041 void decraddr(Diskaddr *, Diskaddr *, Diskaddr *);
1043 //#pragma linkage(readrec, OS)
1044 char *readrec(Diskaddr *, Devaddr *, int, void *);
1046 //#pragma linkage(writerec, OS)
1047 int writerec(Diskaddr*, Devaddr *, int, void *);
1049 char prhold(char *, ...);
1051 void dump(char *, int);
1053 void fdump(FILE *, char *, int);
1055 void fwdump(FILE *, char *, int);
1057 //char toascii(char);
1059 char *strtoas(char *);
1061 char *strntoas(char *, int);
1063 char toebcdic(char);
1065 char *strtoeb(char *);
1067 char *strntoeb(char *, int);
1069 char *lfind(char *, char *, int, int, int(*)(char *, char *));
1071 char *lsearch(char *, char *, int *, int, int(*)(char *, char *));
1073 bool strcmpw(char *, char *);
1075 int strccnt(char *, int);
1077 int strnccnt(char *, int, size_t);
1079 int pprt(FILE *, char *, char *, char *, char *, ...);
1081 bool pprtbrk(FILE *, char *, char *, char *);
1083 bool pprtend(FILE *, char *);
1085 bool pprtinit(int, char, char *, char *, char *);
1087 char *monthnam(int, char);
1089 char *getrec(FILE *, int, char *);
1091 bool jtog(int, int, int *, int *, int *);
1093 bool gtoj(int, int, int, int *, int *);
1095 bool ccap2std(char *, Devaddr *, Diskaddr *);
1097 bool std2ccap(Devaddr *, Diskaddr *, char *);
1099 char *strupr(char *);
1100 char *strlwr(char *);
1101 //char *strdup(char *);
1102 //int strcmpi(char *, char *);
1104 //void *memccpy(void *, void *, int, unsigned);
1106 char *rptstrip(char *);
1107 char *rptfmt(char *);
1108 char *rptfmti(char *, unsigned short int);
1110 char *strnstr(char *, char *, size_t);
1113 int ccregion(char *);
1116 void *memrchr(const void *, int, size_t);
1118 bool sysmonms(char *, char *, ...);
1119 bool sysmoncl(char *);
1121 short prevndx ( short max, short min, short current );
1122 short nextndx ( short max, short min, short current );
1124 time_t extrym ( unsigned day, unsigned hour, unsigned minute );
1125 time_t extrymd ( unsigned hour, unsigned minute );
1127 int cmptimet ( time_t t1, time_t t2 );
1129 int tfprintf ( FILE *, const char *, ... );
1131 bool purgelog ( char *filename, unsigned short delete_age );
1133 time_t odbtime ( void );
1135 int bltnpcnt ( char *, int );
1136 void bltnpage ( char *, int, int );
1138 void rot( char *, unsigned int );
1139 void unrot( char *, unsigned int );
1141 void encrypt( char *, char * );
1142 void decrypt( char *, char * );
1144 int HEXTOI( char *, int );
1146 char **hdgxref( char * );
1148 struct tm *zonetime( unsigned short, unsigned short, char );
1150 int wordcnt( char * );
1151 int wordcntn( char *, unsigned int );
1153 char *word( char *, unsigned int );
1154 char *wordn( char *, unsigned int, unsigned int );
1156 char *crlfstrp( char * );
1158 bool charcmp( char *, char * );
1160 int linecnt( char * );
1161 int linecntn( char *, unsigned int );
1163 char *bltline( char *, unsigned int );
1164 char *bltlinen( char *, unsigned int, unsigned int );
1166 char *pttoline( char *, unsigned int );
1167 char *pttoword( char *, unsigned int );
1169 char *moblrgn(unsigned short,
1173 char *nxtgroup( char * );