/* returns RB_FULL -2, if buffer cannot accept more data */ sint_16 rb_write_get_index( void ) { if(read_index == INC_INDEX(write_index)) return RB_FULL ; else return INC_INDEX(write_index); }
/* returns RB_EMPTY -1, if no buffer in the data */ sint_16 rb_read_get_index( void ) { if ( read_index == write_index ) return RB_EMPTY; else return INC_INDEX(read_index); }
int scanopt (scanopt_t *svoid, char **arg, int *optindex) { char *optname = NULL, *optarg = NULL, *pstart; int namelen = 0, arglen = 0; int errcode = 0, has_next; const optspec_t *optp; struct _scanopt_t *s; struct _aux *auxp; int is_short; int opt_offset = -1; s = (struct _scanopt_t *) svoid; /* Normalize return-parameters. */ SAFE_ASSIGN (arg, NULL); SAFE_ASSIGN (optindex, s->index); if (s->index >= s->argc) return 0; /* pstart always points to the start of our current scan. */ pstart = s->argv[s->index] + s->subscript; if (!pstart) return 0; if (s->subscript == 0) { /* test for exact match of "--" */ if (pstart[0] == '-' && pstart[1] == '-' && !pstart[2]) { SAFE_ASSIGN (optindex, s->index + 1); INC_INDEX (s, 1); return 0; } /* Match an opt. */ if (matchlongopt (pstart, &optname, &namelen, &optarg, &arglen)) { /* it LOOKS like an opt, but is it one?! */ if (!find_opt (s, 1, optname, namelen, &errcode, &opt_offset)) { scanopt_err (s, 0, errcode); return errcode; } /* We handle this below. */ is_short = 0; /* Check for short opt. */ } else if (pstart[0] == '-' && pstart[1]) { /* Pass through to below. */ is_short = 1; s->subscript++; pstart++; } else { /* It's not an option. We're done. */ return 0; } } /* We have to re-check the subscript status because it * may have changed above. */ if (s->subscript != 0) { /* we are somewhere in a run of short opts, * e.g., at the 'z' in `tar -xzf` */ optname = pstart; namelen = 1; is_short = 1; if (!find_opt (s, 0, pstart, namelen, &errcode, &opt_offset)) { scanopt_err(s, 1, errcode); return errcode; } optarg = pstart + 1; if (!*optarg) { optarg = NULL; arglen = 0; } else arglen = (int) strlen (optarg); } /* At this point, we have a long or short option matched at opt_offset into * the s->options array (and corresponding aux array). * A trailing argument is in {optarg,arglen}, if any. */ /* Look ahead in argv[] to see if there is something * that we can use as an argument (if needed). */ has_next = s->index + 1 < s->argc; optp = s->options + opt_offset; auxp = s->aux + opt_offset; /* case: no args allowed */ if (auxp->flags & ARG_NONE) { if (optarg && !is_short) { scanopt_err(s, is_short, SCANOPT_ERR_ARG_NOT_ALLOWED); INC_INDEX (s, 1); return SCANOPT_ERR_ARG_NOT_ALLOWED; } else if (!optarg) INC_INDEX (s, 1); else s->subscript++; return optp->r_val; } /* case: required */ if (auxp->flags & ARG_REQ) { if (!optarg && !has_next) { scanopt_err(s, is_short, SCANOPT_ERR_ARG_NOT_FOUND); return SCANOPT_ERR_ARG_NOT_FOUND; } if (!optarg) { /* Let the next argv element become the argument. */ SAFE_ASSIGN (arg, s->argv[s->index + 1]); INC_INDEX (s, 2); } else { SAFE_ASSIGN (arg, (char *) optarg); INC_INDEX (s, 1); } return optp->r_val; } /* case: optional */ if (auxp->flags & ARG_OPT) { SAFE_ASSIGN (arg, optarg); INC_INDEX (s, 1); return optp->r_val; } /* Should not reach here. */ return 0; }
void rb_end_write(void) { write_index = INC_INDEX(write_index); }
sint_16* rb_begin_write(void) { if(read_index == INC_INDEX(write_index)) return 0; return ring_buf[INC_INDEX(write_index)]; }
void rb_end_read(void) { read_index = INC_INDEX(read_index); }