FreeBASIC  0.91.0
dev_lpt_test.c
Go to the documentation of this file.
1 /* LPTx device */
2 
3 #include "fb.h"
4 #include <ctype.h>
5 
17  (
18  DEV_LPT_PROTOCOL ** lpt_proto_out,
19  const char * proto_raw,
20  size_t proto_raw_len,
21  int subst_prn
22  )
23 {
24  char *p, *ptail, *pc, *pe;
25  DEV_LPT_PROTOCOL *lpt_proto;
26 
27  if( proto_raw == NULL )
28  return FALSE;
29 
30  if( lpt_proto_out == NULL )
31  return FALSE;
32 
33  *lpt_proto_out = calloc( sizeof( DEV_LPT_PROTOCOL ) + proto_raw_len + 2, 1 );
34  lpt_proto = *lpt_proto_out;
35 
36  if( lpt_proto == NULL )
37  return FALSE;
38 
39  strncpy( lpt_proto->raw, proto_raw, proto_raw_len );
40  lpt_proto->raw[proto_raw_len] = '\0';
41 
42  p = lpt_proto->raw;
43  ptail = p + strlen( lpt_proto->raw );
44 
45  lpt_proto->iPort = 0;
46  lpt_proto->proto =
47  lpt_proto->name =
48  lpt_proto->title =
49  lpt_proto->emu = ptail;
50 
51  /* "PRN:" */
52 
53  if( strcasecmp( p, "PRN:" ) == 0)
54  {
55  if( subst_prn )
56  strcpy( p, "LPT1:" );
57 
58  lpt_proto->proto = p;
59  lpt_proto->iPort = 1;
60  return TRUE;
61  }
62 
63  /* "LPTx:" */
64 
65  if( strncasecmp( p, "LPT", 3) != 0)
66  return FALSE;
67 
68  pc = strchr( p, ':' );
69  if( !pc )
70  return FALSE;
71 
72  lpt_proto->proto = p;
73  p = pc + 1;
74  *pc-- = '\0';
75 
76  /* Get port number if any */
77  while( ( *pc >= '0' ) && ( *pc <= '9' ))
78  pc--;
79  pc++;
80  lpt_proto->iPort = atoi( pc );
81 
82  /* Name, TITLE=?, EMU=? */
83 
84  while( *p )
85  {
86  if( isspace( *p ) || ( *p == ',' ))
87  p++;
88 
89  else
90  {
91  char * pt;
92 
93  pe = strchr(p, '=');
94  pc = strchr(p, ',');
95 
96  if( pc && pe > pc )
97  pe = NULL;
98 
99  if( !pe )
100  {
101  lpt_proto->name = p;
102  }
103  else
104  {
105  /* remove spaces before '=' */
106  pt = pe - 1;
107  while( isspace( *pt )) *pt-- = '\0';
108 
109  /* remove spaces after '=' or end*/
110  *pe++ = '\0';
111  while( isspace( *pe )) *pe++ = '\0';
112 
113  if( strcasecmp( p, "EMU" ) == 0)
114  {
115  lpt_proto->emu = pe;
116  }
117  else if( strcasecmp( p, "TITLE" ) == 0)
118  {
119  lpt_proto->title = pe;
120  }
121  /* just ignore options we don't understand to allow forward compatibility */
122  }
123 
124  /* remove spaces before ',' or end*/
125  pt = pc ? pc : ptail;
126  pt--;
127  while( isspace( *pt )) *pt-- = '\0';
128 
129  if( pc )
130  {
131  p = pc + 1;
132  *pc = '\0';
133  }
134  else
135  {
136  p = ptail;
137  }
138  }
139  }
140 
141  return TRUE;
142 }
143 
144 int fb_DevLptTestProtocol( FB_FILE *handle, const char *filename, size_t filename_len )
145 {
146  DEV_LPT_PROTOCOL *lpt_proto;
147  int ret = fb_DevLptParseProtocol( &lpt_proto, filename, filename_len, FALSE );
148  if( lpt_proto )
149  free( lpt_proto );
150  return ret;
151 }