| 1 | #include "slalib.h"
|
|---|
| 2 | #include "slamac.h"
|
|---|
| 3 | #include <string.h>
|
|---|
| 4 | void slaDbjin ( char *string, int *nstrt,
|
|---|
| 5 | double *dreslt, int *jf1, int *jf2 )
|
|---|
| 6 | /*
|
|---|
| 7 | ** - - - - - - - - -
|
|---|
| 8 | ** s l a D b j i n
|
|---|
| 9 | ** - - - - - - - - -
|
|---|
| 10 | **
|
|---|
| 11 | ** Convert free-format input into double precision floating point,
|
|---|
| 12 | ** using slaDfltin but with special syntax extensions.
|
|---|
| 13 | **
|
|---|
| 14 | ** The purpose of the syntax extensions is to help cope with mixed
|
|---|
| 15 | ** FK4 and FK5 data. In addition to the syntax accepted by slaDfltin,
|
|---|
| 16 | ** the following two extensions are recognized by dbjin:
|
|---|
| 17 | **
|
|---|
| 18 | ** 1) A valid non-null field preceded by the character 'B'
|
|---|
| 19 | ** (or 'b') is accepted.
|
|---|
| 20 | **
|
|---|
| 21 | ** 2) A valid non-null field preceded by the character 'J'
|
|---|
| 22 | ** (or 'j') is accepted.
|
|---|
| 23 | **
|
|---|
| 24 | ** The calling program is notified of the incidence of either of these
|
|---|
| 25 | ** extensions through an supplementary status argument. The rest of
|
|---|
| 26 | ** the arguments are as for slaDfltin.
|
|---|
| 27 | **
|
|---|
| 28 | ** Given:
|
|---|
| 29 | ** *string char string containing field to be decoded
|
|---|
| 30 | ** *nstrt int where to start decode (1st = 1)
|
|---|
| 31 | **
|
|---|
| 32 | **
|
|---|
| 33 | ** Returned:
|
|---|
| 34 | ** *nstrt int incremented
|
|---|
| 35 | ** *dreslt double result
|
|---|
| 36 | ** *jf1 int dfltin status: -1 = -OK
|
|---|
| 37 | ** 0 = +OK
|
|---|
| 38 | ** +1 = null field
|
|---|
| 39 | ** +2 = error
|
|---|
| 40 | ** *jf2 int syntax flag: 0 = normal slaDfltin syntax
|
|---|
| 41 | ** +1 = 'B' or 'b'
|
|---|
| 42 | ** +2 = 'J' or 'j'
|
|---|
| 43 | **
|
|---|
| 44 | ** Called: slaDfltin
|
|---|
| 45 | **
|
|---|
| 46 | ** For details of the basic syntax, see slaDfltin.
|
|---|
| 47 | **
|
|---|
| 48 | ** Last revision: 22 December 1993
|
|---|
| 49 | **
|
|---|
| 50 | ** Copyright P.T.Wallace. All rights reserved.
|
|---|
| 51 | */
|
|---|
| 52 | {
|
|---|
| 53 | int j2a, lenstr, na, j1a, nb, j1b;
|
|---|
| 54 | char c;
|
|---|
| 55 |
|
|---|
| 56 | /* Preset syntax flag */
|
|---|
| 57 | j2a = 0;
|
|---|
| 58 |
|
|---|
| 59 | /* Length of string */
|
|---|
| 60 | lenstr = strlen ( string );
|
|---|
| 61 |
|
|---|
| 62 | /* Position of current character */
|
|---|
| 63 | na = *nstrt;
|
|---|
| 64 |
|
|---|
| 65 | /* Attempt normal decode */
|
|---|
| 66 | slaDfltin ( string, &na, dreslt, &j1a );
|
|---|
| 67 |
|
|---|
| 68 | /* Proceed only if pointer still within string */
|
|---|
| 69 | if ( ( na > 0 ) && ( na <= lenstr ) ) {
|
|---|
| 70 |
|
|---|
| 71 | /* See if slaDfltin reported a null field */
|
|---|
| 72 | if ( j1a == 1 ) {
|
|---|
| 73 |
|
|---|
| 74 | /* It did: examine character it stuck on */
|
|---|
| 75 | c = string[na-1];
|
|---|
| 76 | if ( c == 'B' || c == 'b' ) {
|
|---|
| 77 |
|
|---|
| 78 | /* 'B' or 'b' - provisionally note */
|
|---|
| 79 | j2a = 1;
|
|---|
| 80 |
|
|---|
| 81 | } else if ( c == 'J' || c == 'j' ) {
|
|---|
| 82 |
|
|---|
| 83 | /* 'J' or 'j' - provisionally note */
|
|---|
| 84 | j2a = 2;
|
|---|
| 85 | }
|
|---|
| 86 |
|
|---|
| 87 | /* Following B or J, attempt to decode a number */
|
|---|
| 88 | if ( j2a == 1 || j2a == 2 ) {
|
|---|
| 89 | nb = na + 1;
|
|---|
| 90 | slaDfltin ( string, &nb, dreslt, &j1b );
|
|---|
| 91 |
|
|---|
| 92 | /* If successful, copy pointer and status */
|
|---|
| 93 | if ( j1b <= 0 ) {
|
|---|
| 94 | na = nb;
|
|---|
| 95 | j1a = j1b;
|
|---|
| 96 |
|
|---|
| 97 | /* If not, forget about the B or J */
|
|---|
| 98 | } else {
|
|---|
| 99 | j2a = 0;
|
|---|
| 100 | }
|
|---|
| 101 | }
|
|---|
| 102 | }
|
|---|
| 103 | }
|
|---|
| 104 |
|
|---|
| 105 | /* Return argument values and exit */
|
|---|
| 106 | *nstrt = na;
|
|---|
| 107 | *jf1 = j1a;
|
|---|
| 108 | *jf2 = j2a;
|
|---|
| 109 | }
|
|---|