1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/* Copyright (C) 2000 Damir Zucic */
/*=============================================================================
residue_ranges.c
Purpose:
Extract residue ranges (serial numbers) from the list.
Input:
(1) Pointer to SelectS structure, where data will be stored.
(2) Pointer to the string with list of ranges.
Output:
(1) Some data added to SelectS structure.
(2) Return value.
Return value:
(1) Positive on success.
(2) Negative on failure.
========includes:============================================================*/
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include "defines.h"
#include "typedefs.h"
/*======function prototypes:=================================================*/
char *ExtractToken_ (char *, int, char *, char *);
int ExtractSerials_ (int *, int *, char *);
/*======extract residue ranges:==============================================*/
int ExtractResidueRanges_ (SelectS *selectSP, char *stringP)
{
char *remainderP;
char tokenA[SHORTSTRINGSIZE];
int max;
int n1, n2;
int rangeI;
/* Check the string length: */
if (strlen (stringP) == 0) return -1;
/* Initialize all_residue_serialF (1 = select all serial numbers): */
selectSP->all_residue_serialF = 0;
/* Initialize the number of ranges: */
selectSP->residue_serial_rangesN = 0;
/* If wildcard (asterisk) is present, set */
/* all_residue_serialF to one and return: */
if (strstr (stringP, "*"))
{
selectSP->all_residue_serialF = 1;
return 1;
}
/* Parse the list of ranges: */
remainderP = stringP;
max = SHORTSTRINGSIZE;
while ((remainderP = ExtractToken_ (tokenA, max, remainderP, " \t,;")) != NULL)
{
/** Extract serial numbers: **/
if (ExtractSerials_ (&n1, &n2, tokenA) < 0) return -2;
/** Copy serial numbers: **/
rangeI = selectSP->residue_serial_rangesN;
selectSP->residue_serial_start[rangeI] = n1;
selectSP->residue_serial_end[rangeI] = n2;
/** Increase and check the number of ranges: **/
selectSP->residue_serial_rangesN++;
if (selectSP->residue_serial_rangesN >= MAXFIELDS) break;
}
/* Return positive value on success: */
return 1;
}
/*===========================================================================*/
|