rpm  4.5
parseReqs.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 
8 #define _RPMEVR_INTERNAL
9 #include "rpmbuild.h"
10 #include "debug.h"
11 
12 #define SKIPWHITE(_x) {while(*(_x) && (xisspace(*_x) || *(_x) == ',')) (_x)++;}
13 #define SKIPNONWHITE(_x){while(*(_x) &&!(xisspace(*_x) || *(_x) == ',')) (_x)++;}
14 
15 int parseRCPOT(Spec spec, Package pkg, const char *field, rpmTag tagN,
16  int index, rpmsenseFlags tagflags)
17 {
18  const char *r, *re, *v, *ve;
19  char * N, * EVR;
20  rpmsenseFlags Flags;
21  Header h;
22 
23  switch (tagN) {
25  tagflags |= RPMSENSE_PROVIDES;
26  h = pkg->header;
27  break;
29  tagflags |= RPMSENSE_OBSOLETES;
30  h = pkg->header;
31  break;
33  tagflags |= RPMSENSE_CONFLICTS;
34  h = pkg->header;
35  break;
37  tagflags |= RPMSENSE_CONFLICTS;
38  h = spec->sourceHeader;
39  break;
40  case RPMTAG_PREREQ:
41  tagflags |= RPMSENSE_ANY;
42  h = pkg->header;
43  break;
45  tagflags |= RPMSENSE_TRIGGERPREIN;
46  h = pkg->header;
47  break;
48  case RPMTAG_TRIGGERIN:
49  tagflags |= RPMSENSE_TRIGGERIN;
50  h = pkg->header;
51  break;
53  tagflags |= RPMSENSE_TRIGGERPOSTUN;
54  h = pkg->header;
55  break;
56  case RPMTAG_TRIGGERUN:
57  tagflags |= RPMSENSE_TRIGGERUN;
58  h = pkg->header;
59  break;
62  tagflags |= RPMSENSE_MISSINGOK;
63  h = spec->sourceHeader;
64  break;
65  case RPMTAG_BUILDPREREQ:
67  tagflags |= RPMSENSE_ANY;
68  h = spec->sourceHeader;
69  break;
71  tagflags |= RPMSENSE_PROVIDES;
72  h = spec->sourceHeader;
73  break;
75  tagflags |= RPMSENSE_OBSOLETES;
76  h = spec->sourceHeader;
77  break;
78  default:
80  tagflags |= RPMSENSE_ANY;
81  h = pkg->header;
82  break;
83  }
84 
85 /*@-boundsread@*/
86  for (r = field; *r != '\0'; r = re) {
87  size_t nr;
88  SKIPWHITE(r);
89  if (*r == '\0')
90  break;
91 
92  Flags = (tagflags & ~RPMSENSE_SENSEMASK);
93 
94  /* Tokens must begin with alphanumeric, _, or / */
95  nr = strlen(r);
96  if (!(xisalnum(r[0]) || r[0] == '_' || r[0] == '/'
97  || (nr > 2 && r[0] == '!')
98  || (nr > 3 && r[0] == '%' && r[1] == '{' && r[nr-1] == '}')))
99  {
101  _("line %d: Dependency \"%s\" must begin with alpha-numeric, '_' or '/': %s\n"),
102  spec->lineNum, spec->line, r);
103  return RPMERR_BADSPEC;
104  }
105 
106  re = r;
107  SKIPNONWHITE(re);
108  N = xmalloc((re-r) + 1);
109  strncpy(N, r, (re-r));
110  N[re-r] = '\0';
111 
112  /* Parse EVR */
113  v = re;
114  SKIPWHITE(v);
115  ve = v;
116  SKIPNONWHITE(ve);
117 
118  re = v; /* ==> next token (if no EVR found) starts here */
119 
120  /* Check for possible logical operator */
121  if (ve > v) {
122  rpmsenseFlags F = rpmEVRflags(v, &ve);
123  if (F && r[0] == '/') {
125  _("line %d: Versioned file name not permitted: %s\n"),
126  spec->lineNum, spec->line);
127  return RPMERR_BADSPEC;
128  }
129  if (F) {
130  /* now parse EVR */
131  v = ve;
132  SKIPWHITE(v);
133  ve = v;
134  SKIPNONWHITE(ve);
135  }
136  Flags &= ~RPMSENSE_SENSEMASK;
137  Flags |= F;
138  }
139 
140  /*@-branchstate@*/
141  if (Flags & RPMSENSE_SENSEMASK) {
142  if (*v == '\0' || ve == v) {
143  rpmError(RPMERR_BADSPEC, _("line %d: Version required: %s\n"),
144  spec->lineNum, spec->line);
145  return RPMERR_BADSPEC;
146  }
147  EVR = xmalloc((ve-v) + 1);
148  strncpy(EVR, v, (ve-v));
149  EVR[ve-v] = '\0';
150  re = ve; /* ==> next token after EVR string starts here */
151  } else
152  EVR = NULL;
153  /*@=branchstate@*/
154 
155  (void) addReqProv(spec, h, tagN, N, EVR, Flags, index);
156 
157  N = _free(N);
158  EVR = _free(EVR);
159 
160  }
161 /*@=boundsread@*/
162 
163  return 0;
164 }