]> git.mxchange.org Git - simgear.git/blob - simgear/metar/Local.h
-Added .cvsignore files to clean up CVS messages
[simgear.git] / simgear / metar / Local.h
1 /*********************************************************************/
2 /*                                                                   */
3 /*  Title: local h                                                   */
4 /*  Updated: 3 June 1996                                             */
5 /*  Organization: W/OSO242 - Graphics and Display Section            */
6 /*  Language: C/370                                                  */
7 /*                                                                   */
8 /*  Abstract:                                                        */
9 /*  This header file provides all function definitions necessary for */
10 /*  the OSO242 C function library.                                   */
11 /*                                                                   */
12 /*********************************************************************/
13  
14 #ifndef locallib_defined
15 #define locallib_defined
16  
17  
18  
19 /*****************/
20 /* Include Files */
21 /*****************/
22  
23 #include <assert.h>
24 #include <ctype.h>
25 #include <errno.h>
26 #include <float.h>
27 #include <limits.h>
28 #include <locale.h>
29 #include <math.h>
30 #include <setjmp.h>
31 #include <signal.h>
32 #include <stdarg.h>
33 #include <stddef.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <time.h>
38  
39  
40  
41 /********************/
42 /* Standard Defines */
43 /********************/
44  
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 */
53  
54  
55 /*****************/
56 /* Macro defines */
57 /*****************/
58  
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 #ifndef MAX
69 #  define MAX(x, y)    (((x) < (y)) ? (y) : (x))
70 #endif
71 #ifndef max
72 #  define max(x, y)    (((x) < (y)) ? (y) : (x))
73 #endif
74 #ifndef MIN
75 #  define MIN(x, y)    (((x) < (y)) ? (x) : (y))
76 #endif
77 #ifndef min
78 #  define min(x, y)    (((x) < (y)) ? (x) : (y))
79 #endif
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))
87  
88  
89 /*********************************************************************/
90 /*                                                                   */
91 /* Memory allocation debugging routines                              */
92 /*                                                                   */
93 /*********************************************************************/
94  
95 #ifdef MEMDEBUG
96  
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);
101  
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__)
106  
107 #define malloc malloct
108 #define calloc calloct
109 #define realloc realloct
110 #define free freet
111  
112 #endif
113  
114  
115  
116 /*********************************************************************/
117 /*                                                                   */
118 /* General typedefs                                                  */
119 /*                                                                   */
120 /*********************************************************************/
121  
122 typedef unsigned char byte;
123  
124 #ifndef __cplusplus
125 typedef unsigned short int bool;
126 #endif
127
128 typedef unsigned short int Devaddr;
129  
130 typedef struct diskaddr {
131    int cylinder;
132    int track;
133    int record;
134 } Diskaddr;
135  
136  
137 typedef struct record_id {
138  
139    char id[8];
140    time_t write_timestamp;
141  
142 } Record_ID;
143  
144  
145 typedef struct location {
146  
147    union {
148       unsigned bsn;
149       char cs[9];
150       unsigned short msn;
151    } loc;
152  
153    unsigned location_is_bsn:1,
154             location_is_cs:1,
155             location_is_msn:1;
156  
157 } Location;
158  
159  
160  
161 /*********************************************************************/
162 /*********************************************************************/
163 /*                                                                   */
164 /*                                                                   */
165 /* Functions specific defines, typedefs, and structures              */
166 /*                                                                   */
167 /*                                                                   */
168 /*********************************************************************/
169 /*********************************************************************/
170  
171  
172  
173 /*********************************************************************/
174 /*                                                                   */
175 /* Function prototype and structure(s) used in -                     */
176 /*                                                                   */
177 /* bldstree - Build station information tree                         */
178 /* delstree - Delete station information tree                        */
179 /* getstinf - Get station information from tree                      */
180 /*                                                                   */
181 /*********************************************************************/
182  
183 typedef struct stn_info_node {
184      int key;
185      int block;
186      int station;
187      int latitude;
188      int longitude;
189      int elev;
190      struct stn_info_node * right;
191      struct stn_info_node * left;
192 } Stninfo;
193  
194 struct stn_info_node *bldstree(void);
195 void delstree(struct stn_info_node *);
196 struct stn_info_node *getstinf(struct stn_info_node *,
197                                int,
198                                int);
199  
200  
201  
202 /*********************************************************************/
203 /*                                                                   */
204 /* Function prototype and structure(s) used in -                     */
205 /*                                                                   */
206 /* capqread - Read bulletins from CAPQ chain                         */
207 /*                                                                   */
208 /*********************************************************************/
209  
210 typedef struct CAPQ_data {
211    char * bulletin;
212    int bulletin_length;
213    char * WMO_heading;
214    char * AFOS_pil;
215    char * current_CAPQ_end_address;
216    int start_offset;
217    int record_count;
218    int end_offset;
219    char * bulletin_address;
220    int input_line;
221    int receive_line;
222    int receive_hour;
223    int receive_minute;
224    int CAPQ_day;
225    int CAPQ_hour;
226    int CAPQ_minute;
227    int rc;
228    char flag1;
229    char flag2;
230 } CAPQdata;
231  
232 struct CAPQ_data * capqread (char *, ...);
233  
234  
235  
236 /*********************************************************************/
237 /*                                                                   */
238 /* Function prototype and structure(s) used in -                     */
239 /*                                                                   */
240 /* mdadread - Read bulletins from MDAD chain                         */
241 /*                                                                   */
242 /*********************************************************************/
243  
244 typedef struct MDAD_data {
245    char * bulletin;
246    int bulletin_length;
247    char * WMO_heading;
248    char * AFOS_pil;
249    char * current_MDAD_end_address;
250    int start_offset;
251    int record_count;
252    int end_offset;
253    char * bulletin_address;
254    int input_line;
255    int receive_line;
256    int receive_hour;
257    int receive_minute;
258    int MDAD_year;
259    int MDAD_month;
260    int MDAD_day;
261    int MDAD_hour;
262    int MDAD_minute;
263    int rc;
264    int part_number;
265    int number_of_parts;
266    char MDAD_flag;
267    char flag1;
268    char flag2;
269    char flag3;
270    char MDAD_flag2;
271 } MDADdata;
272  
273 MDADdata * mdadread (char *, ...);
274  
275 MDADdata * mdadscan (char *, ...);
276  
277 void mdadinpt ( MDADdata *, char, bool );
278  
279 char * mdadnxtr ( void );
280 char * mdadnxtk ( void );
281  
282  
283 #define MDAD_HISTORY_LIMIT 39
284  
285 typedef
286 struct MDAD_history_entry
287 {
288    unsigned short hour;
289    unsigned short minute;
290    Diskaddr MDAD_chain_addr;
291 }
292 MDAD_History_Entry;
293  
294 typedef
295 struct MDAD_history
296 {
297    MDAD_History_Entry history_array[MDAD_HISTORY_LIMIT];
298 }
299 MDAD_History;
300  
301 MDAD_History *mdadhist ( void );
302  
303  
304 /*********************************************************************/
305 /*                                                                   */
306 /* Function prototype and structure(s) used in -                     */
307 /*                                                                   */
308 /* gethdgi - Get bulletin heading information                        */
309 /*                                                                   */
310 /*********************************************************************/
311  
312 typedef struct bltn_heading_info {
313     int bltn_day;
314     int bltn_hour;
315     int bltn_min;
316     int rtd_present;
317     int cor_present;
318     int amd_present;
319     char * first_report;
320     // char TTAAii??(7??);
321     // char CCCC??(5??);
322     char amd_seq;
323     char cor_seq;
324     char rtd_seq;
325 } Abbrevhdg;
326  
327 Abbrevhdg *gethdgi(char * );
328  
329  
330  
331 /*********************************************************************/
332 /*                                                                   */
333 /* Function prototype and structure(s) used in -                     */
334 /*                                                                   */
335 /* getime  - Get current system time                                 */
336 /* suspend - Delay execution until specified minute boundary         */
337 /*                                                                   */
338 /*********************************************************************/
339  
340  
341 typedef struct tm_struct{
342    int hour;
343    int min;
344 } Stime;
345  
346 Stime *gettime(void);
347 int suspend(Stime *, int);
348 int timediff(Stime *, Stime *);
349 #define timecmp timediff
350  
351  
352  
353 /*********************************************************************/
354 /*                                                                   */
355 /* Function prototype and structure(s) used in -                     */
356 /*                                                                   */
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                            */
363 /*                                                                   */
364 /*********************************************************************/
365  
366 typedef struct rgtrdata {
367    Diskaddr forward_chain;
368    Diskaddr bulletin_addr;
369    int receive_line;
370    int receive_day;
371    Stime receive_time;
372    Stime RGTR_time;
373    int length;
374    char *bulletin;
375    char datatype;
376 } RGTRdata;
377  
378 int rdtaend(char, Diskaddr *);
379 int rdtaread(RGTRdata *);
380 int rdtastrt(char, Diskaddr *);
381 int rdtatend (char, Stime *);
382 int rdtatnke(char);
383 int rdtatstr(char, Stime *);
384 void rdtainit(void);
385  
386  
387  
388 /*********************************************************************/
389 /*                                                                   */
390 /*  Typedefs and function prototypes for bulletin and report parsing */
391 /*  functions.                                                       */
392 /*                                                                   */
393 /*********************************************************************/
394  
395  
396  
397 typedef struct rptNode {
398    char *rptPtr;
399    int rptLength;
400    struct rptNode* next;
401 } RptNode;
402  
403  
404 typedef struct synpBltn {
405    Abbrevhdg heading;
406    short int day;
407    short int hour;
408    int reportCount;
409    RptNode *rptList;
410    bool valid;
411 } SynpBltn;
412  
413  
414 typedef struct shipBltn {
415    Abbrevhdg heading;
416    int reportCount;
417    RptNode *rptList;
418    bool valid;
419 } ShipBltn;
420  
421  
422 typedef struct tepiBltn {
423    Abbrevhdg heading;
424    int reportCount;
425    RptNode *rptList;
426    bool valid;
427 } TePiBltn;
428  
429  
430 typedef struct drftBltn {
431    Abbrevhdg heading;
432    int reportCount;
433    RptNode *rptList;
434    bool valid;
435 } DrftBltn;
436  
437  
438 typedef struct airpBltn {
439    Abbrevhdg heading;
440    int reportCount;
441    RptNode *rptList;
442    bool valid;
443 } AirpBltn;
444  
445  
446 typedef struct amdrBltn {
447    Abbrevhdg heading;
448    short int day;
449    short int hour;
450    int reportCount;
451    RptNode *rptList;
452    bool valid;
453 } AmdrBltn;
454  
455  
456 typedef struct bthyBltn {
457    Abbrevhdg heading;
458    int reportCount;
459    RptNode *rptList;
460    bool valid;
461 } BthyBltn;
462  
463  
464 typedef struct tescBltn {
465    Abbrevhdg heading;
466    int reportCount;
467    RptNode *rptList;
468    bool valid;
469 } TescBltn;
470  
471  
472 typedef struct tracBltn {
473    Abbrevhdg heading;
474    int reportCount;
475    RptNode *rptList;
476    bool valid;
477 } TracBltn;
478  
479  
480 typedef struct climBltn {
481    Abbrevhdg heading;
482    int reportCount;
483    int month;
484    int year;
485    RptNode *rptList;
486    bool valid;
487 } ClimBltn;
488  
489  
490 typedef struct clmtBltn {
491    Abbrevhdg heading;
492    int reportCount;
493    int month;
494    int year;
495    RptNode *rptList;
496    bool valid;
497 } ClmtBltn;
498  
499  
500 typedef struct metBltn {
501    Abbrevhdg heading;
502    int reportCount;
503    RptNode *rptList;
504    bool valid;
505    short int day;              /* -1 indicates missing/invalid */
506    short int hour;             /* -1 indicates missing/invalid */
507    short int min;              /* -1 indicates missing/invalid */
508 } MetBltn;
509  
510  
511 typedef struct saoBltn {
512    Abbrevhdg heading;
513    int reportCount;
514    RptNode *rptList;
515    bool valid;
516 } SAOBltn;
517  
518  
519 typedef struct prBltn {
520    Abbrevhdg heading;
521    int reportCount;
522    RptNode *rptList;
523    bool valid;
524 } PRBltn;
525  
526  
527 typedef struct tafBltn {
528    Abbrevhdg heading;
529    int reportCount;
530    RptNode *rptList;
531    bool valid;
532 } TafBltn;
533  
534  
535 typedef struct metrRptP {
536    char locind[4];
537    int groupCount;
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 */
541    bool valid;
542 } MetrRptP;
543  
544  
545 typedef struct saoRptP {
546    char locind[4];
547    int groupCount;
548    short int hour;            /* -1 indicates missing or invalid */
549    short int min;             /* -1 indicates missing or invalid */
550    bool valid;
551 } SAORptP;
552  
553  
554 typedef struct prRptP {
555    char locind[4];
556    int groupCount;
557    short int hour;            /* -1 indicates missing or invalid */
558    short int min;             /* -1 indicates missing or invalid */
559    bool valid;
560 } PRRptP;
561  
562  
563 typedef struct tafRptP {
564    char locind[4];
565    int groupCount;
566    short int YY;
567    short int GG;
568    short int validPeriod;
569    bool ammendment;
570    bool correction;
571    bool valid;
572 } TafRptP;
573  
574  
575 typedef struct synpRptP {
576    short int II;
577    short int iii;
578    int groupCount;
579    bool valid;
580 } SynpRptP;
581  
582  
583 typedef struct climRptP {
584    short int II;
585    short int iii;
586    int groupCount;
587    bool valid;
588 } ClimRptP;
589  
590  
591 typedef struct clmtRptP {
592    short int II;
593    short int iii;
594    int groupCount;
595    bool valid;
596 } ClmtRptP;
597  
598  
599 typedef struct tepiRptP {
600    short int II;
601    short int iii;
602    short int YY;
603    short int GG;
604    short int quad;
605    short int ulatitude;
606    short int ulongitude;
607    int msquare;
608    int latitude;
609    int longitude;
610    int groupCount;
611    char callsign[15];
612    char type;
613    char part;
614    bool valid;
615 } TePiRptP;
616  
617  
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 *);
634  
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);
643  
644  
645  
646  
647 /*********************************************************************/
648 /*                                                                   */
649 /*  Structures and Function Prototypes for RRN physical I/O          */
650 /*                                                                   */
651 /*********************************************************************/
652  
653  
654 typedef struct RRN_device {
655  
656    char name[44],
657         ownerid[8];
658  
659    unsigned short dev_addr,
660                   base_cylinder,
661                   base_track,
662                   base_record,
663                   max_cylinder,
664                   max_track,
665                   max_record,
666                   records_per_track,
667                   tracks_per_cylinder,
668                   record_length;
669  
670 } RRN_Device;
671  
672  
673 bool readrrn(char *device_name,
674              unsigned int rrn,
675              void *input_buffer,
676              unsigned int read_count);
677  
678 bool writerrn(char *device_name,
679               unsigned int rrn,
680               void *output_buffer,
681               unsigned int write_count);
682  
683 RRN_Device *devinfo(char *device_name);
684  
685 bool valid_dn(char *device_name);
686  
687  
688  
689 /*********************************************************************/
690 /*                                                                   */
691 /*  Function prototype for string value test functions.              */
692 /*                                                                   */
693 /*********************************************************************/
694  
695  
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 *);
707  
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);
719  
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 *);
731  
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);
743  
744  
745 /*********************************************************************/
746 /*                                                                   */
747 /*  Enumeration type and declaration for code form identification    */
748 /*  function                                                         */
749 /*                                                                   */
750 /*********************************************************************/
751  
752  
753 typedef
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 }
768 CodeForm;
769  
770 CodeForm idcode(char *);
771  
772 char *codename(CodeForm);
773 CodeForm name2cf ( char * );
774  
775  
776  
777 /*********************************************************************/
778 /*                                                                   */
779 /*  String manipulation functions                                    */
780 /*                                                                   */
781 /*********************************************************************/
782  
783  
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 *, ...);
801  
802  
803  
804 /*********************************************************************/
805 /*                                                                   */
806 /*  Bulletin Generator declarations                                  */
807 /*                                                                   */
808 /*********************************************************************/
809  
810 typedef bool (*ParseBltnFnPtr) ( char *bltn,
811                                  char **rptPtr,
812                                  char *bbbTypePtr,
813                                  char **prefixPtr,
814                                  short *YYPtr,
815                                  short *GGPtr,
816                                  char *bltnTypePtr,
817                                  char **headingPtr );
818  
819 void cbltngen ( ParseBltnFnPtr fnPtr,
820                 char *filename,
821                 Devaddr *historyDevice,
822                 Diskaddr *historyAddr,
823                 unsigned * bltnInCountPtr,
824                 unsigned * bltnOutCountPtr,
825                 unsigned * rptOutCountPtr );
826  
827 void tbltngen ( ParseBltnFnPtr fnPtr,
828                 char *filename,
829                 Devaddr *historyDevice,
830                 Diskaddr *historyAddr,
831                 unsigned * bltnInCountPtr,
832                 unsigned * bltnOutCountPtr,
833                 unsigned * rptOutCountPtr );
834  
835  
836 typedef bool (*ParseBltnFnPtrX) ( char *bltn,
837                                  char **rptPtr,
838                                  char *bbbTypePtr,
839                                  char **prefixPtr,
840                                  short *YYPtr,
841                                  short *GGPtr,
842                                  short *ggPtr,
843                                  char *bltnTypePtr,
844                                  char **headingPtr );
845  
846 void xbltngen ( ParseBltnFnPtrX fnPtr,
847                 char *filename,
848                 Devaddr *historyDevice,
849                 Diskaddr *historyAddr,
850                 unsigned * bltnInCountPtr,
851                 unsigned * bltnOutCountPtr,
852                 unsigned * rptOutCountPtr );
853  
854 void dbltngen ( ParseBltnFnPtrX fnPtr,
855                 char *filename,
856                 Devaddr *historyDevice,
857                 Diskaddr *historyAddr,
858                 unsigned * bltnInCountPtr,
859                 unsigned * bltnOutCountPtr,
860                 unsigned * rptOutCountPtr );
861  
862 typedef bool (*OParseBltnFnPtr) ( char *bltn,
863                                   char **rptPtr,
864                                   char *bbbTypePtr,
865                                   char **prefixPtr,
866                                   short *YYPtr,
867                                   short *GGPtr,
868                                   char *bltnTypePtr,
869                                   char **headingPtr,
870                                   char **ccccPtr );
871  
872 void obltngen ( OParseBltnFnPtr fnPtr,
873                 char *filename,
874                 Devaddr *historyDevice,
875                 Diskaddr *historyAddr,
876                 unsigned * bltnInCountPtr,
877                 unsigned * bltnOutCountPtr,
878                 unsigned * rptOutCountPtr );
879  
880  
881 void pbltngen ( OParseBltnFnPtr fnPtr,
882                 char *filename,
883                 Devaddr *historyDevice,
884                 Diskaddr *historyAddr,
885                 unsigned * bltnInCountPtr,
886                 unsigned * bltnOutCountPtr,
887                 unsigned * rptOutCountPtr );
888  
889  
890  
891 /*********************************************************************/
892 /*                                                                   */
893 /*  Typedefs and function prototypes for retrieving information from */
894 /*  switching directory.                                             */
895 /*                                                                   */
896 /*********************************************************************/
897  
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;
904 } BltnHistory;
905  
906 /*
907 typedef struct sw_dir_info_rec {
908   char wmo_header[11];
909   char AFOS_pil[10];
910   char multiple_line;
911   short int line_num;
912   short int recvd_line;
913   char flag1;
914   char flag2;
915   char flag3;
916   char class;
917   short int domestic_cat_num;
918   char afos_tmp;
919   char ccb[2];
920   char region_addr;
921   short int output_line_count;
922   unsigned short trans_line[128];
923   time_t change_date;
924   char dir_flags;
925   Diskaddr history_file_addr;
926   BltnHistory bltn_history[4];
927 } SwDirInfo;
928  
929 SwDirInfo *rtswdir(char *, int);
930 SwDirInfo *rtpswdir(void);
931 SwDirInfo *rtnswdir(void);
932  
933  */
934  
935  
936  
937 /*********************************************************************/
938 /*                                                                   */
939 /*  General local functions                                          */
940 /*                                                                   */
941 /*********************************************************************/
942  
943  
944 int itoc(int, char *, int);
945  
946 int antoi(char *, int);
947  
948 float antof(char *, int);
949  
950 void errmsg(char *, ...);
951  
952 void logmsg(char *, ...);
953  
954 void opermsg(char *, ...);
955  
956 int lmsg(const char *, const char *, ...);
957 int emsg(const char *, const char *, ...);
958 int omsg(const char *, const char *, ...);
959  
960 //#pragma linkage(ASCTOEB, OS)
961 void ASCTOEB(char *, int);
962  
963 //#pragma linkage(EAXLATE, OS)
964 void EAXLATE(char *, int);
965  
966 //#pragma linkage(PASCTOEB, OS)
967 void PASCTOEB(char *, int);
968  
969 char **bldhdarr(char *);
970  
971 void dalchdar(char **);
972  
973 //#pragma linkage(CCAPREAD, OS)
974 void *CCAPREAD(char *, int);
975  
976 //#pragma linkage(CCAPWRIT, OS)
977 void CCAPWRIT(char *, char *, int);
978  
979 //#pragma linkage(PPTOI, OS)
980 int PPTOI(char);
981  
982 char itopp(int);
983  
984 int diffmin(int, int, int, int, int, int);
985  
986 char incrseq(char);
987  
988 void nextdate(int *, int *, int *);
989  
990 void prevdate(int *, int *, int *);
991  
992 void rdstaddr(char *, char *);
993  
994 int wrenaddr(char *, char *);
995  
996 int vfydigit (char *, int);
997  
998 int readline(char * , int);
999  
1000 int prevjul(int, int);
1001  
1002 int nextjul(int, int);
1003  
1004 int fcomppos(fpos_t *, fpos_t *);
1005  
1006 void lfprint(char *);
1007  
1008 void flfprint(FILE *, char *);
1009  
1010 void slfprint(char *, int, char *);
1011  
1012 void flfnprnt(FILE *, char *, int);
1013  
1014 void slfnprnt(char *, int, char *, int);
1015  
1016 int strhash(char *);
1017  
1018 void reverse(char *);
1019  
1020 //bool itoa(int, char *, int);
1021  
1022 int getsnn(char * , int);
1023  
1024 int fgetsnn(char *, int, FILE *);
1025  
1026 int getreply(char *, char *, int);
1027  
1028 bool strfit(char *, char *, size_t);
1029  
1030 bool addrfrm3(char *, Diskaddr *);
1031  
1032 bool addrfrm5(char *, Diskaddr *);
1033  
1034 bool addrto3(Diskaddr *, char *);
1035  
1036 bool addrto5(Diskaddr *, char *);
1037  
1038 int addrcmp(Diskaddr *, Diskaddr *);
1039  
1040 void incraddr(Diskaddr *, Diskaddr *, Diskaddr *);
1041 void decraddr(Diskaddr *, Diskaddr *, Diskaddr *);
1042  
1043 //#pragma linkage(readrec, OS)
1044 char *readrec(Diskaddr *, Devaddr *, int, void *);
1045  
1046 //#pragma linkage(writerec, OS)
1047 int writerec(Diskaddr*, Devaddr *, int, void *);
1048  
1049 char prhold(char *, ...);
1050  
1051 void dump(char *, int);
1052  
1053 void fdump(FILE *, char *, int);
1054  
1055 void fwdump(FILE *, char *, int);
1056  
1057 //char toascii(char);
1058  
1059 char *strtoas(char *);
1060  
1061 char *strntoas(char *, int);
1062  
1063 char toebcdic(char);
1064  
1065 char *strtoeb(char *);
1066  
1067 char *strntoeb(char *, int);
1068  
1069 char *lfind(char *, char *, int, int, int(*)(char *, char *));
1070  
1071 char *lsearch(char *, char *, int *, int, int(*)(char *, char *));
1072  
1073 bool strcmpw(char *, char *);
1074  
1075 int strccnt(char *, int);
1076  
1077 int strnccnt(char *, int, size_t);
1078  
1079 int pprt(FILE *, char *, char *, char *, char *, ...);
1080  
1081 bool pprtbrk(FILE *, char *, char *, char *);
1082  
1083 bool pprtend(FILE *, char *);
1084  
1085 bool pprtinit(int, char, char *, char *, char *);
1086  
1087 char *monthnam(int, char);
1088  
1089 char *getrec(FILE *, int, char *);
1090  
1091 bool jtog(int, int, int *, int *, int *);
1092  
1093 bool gtoj(int, int, int, int *, int *);
1094  
1095 bool ccap2std(char *, Devaddr *, Diskaddr *);
1096  
1097 bool std2ccap(Devaddr *, Diskaddr *, char *);
1098  
1099 char *strupr(char *);
1100 char *strlwr(char *);
1101 //char *strdup(char *);
1102 //int strcmpi(char *, char *);
1103  
1104 //void *memccpy(void *, void *, int, unsigned);
1105  
1106 char *rptstrip(char *);
1107 char *rptfmt(char *);
1108 char *rptfmti(char *, unsigned short int);
1109  
1110 char *strnstr(char *, char *, size_t);
1111  
1112 int stregion(int);
1113 int ccregion(char *);
1114 char *rgnname(int);
1115  
1116 void *memrchr(const void *, int, size_t);
1117  
1118 bool sysmonms(char *, char *, ...);
1119 bool sysmoncl(char *);
1120  
1121 short prevndx ( short max, short min, short current );
1122 short nextndx ( short max, short min, short current );
1123  
1124 time_t extrym ( unsigned day, unsigned hour, unsigned minute );
1125 time_t extrymd ( unsigned hour, unsigned minute );
1126  
1127 int cmptimet ( time_t t1, time_t t2 );
1128  
1129 int tfprintf ( FILE *, const char *, ... );
1130  
1131 bool purgelog ( char *filename, unsigned short delete_age );
1132  
1133 time_t odbtime ( void );
1134  
1135 int bltnpcnt ( char *, int );
1136 void bltnpage ( char *, int, int );
1137  
1138 void rot( char *, unsigned int );
1139 void unrot( char *, unsigned int );
1140  
1141 void encrypt( char *, char * );
1142 void decrypt( char *, char * );
1143  
1144 int HEXTOI( char *, int );
1145  
1146 char **hdgxref( char * );
1147  
1148 struct tm *zonetime( unsigned short, unsigned short, char );
1149  
1150 int wordcnt( char * );
1151 int wordcntn( char *, unsigned int );
1152  
1153 char *word( char *, unsigned int );
1154 char *wordn( char *, unsigned int, unsigned int );
1155  
1156 char *crlfstrp( char * );
1157  
1158 bool charcmp( char *, char * );
1159  
1160 int linecnt( char * );
1161 int linecntn( char *, unsigned int );
1162  
1163 char *bltline( char *, unsigned int );
1164 char *bltlinen( char *, unsigned int, unsigned int );
1165  
1166 char *pttoline( char *, unsigned int );
1167 char *pttoword( char *, unsigned int );
1168  
1169 char *moblrgn(unsigned short,
1170               unsigned short,
1171               unsigned short );
1172  
1173 char *nxtgroup( char * );
1174  
1175 #endif