|
|
1.1 root 1: /* hppa-aux.c -- Assembler for the PA - PA-RISC specific support routines
2: Copyright (C) 1989 Free Software Foundation, Inc.
3:
4: This file is part of GAS, the GNU Assembler.
5:
6: GAS is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 1, or (at your option)
9: any later version.
10:
11: GAS is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GAS; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: /*
21: HP PA-RISC support was contributed by the Center for Software Science
22: at the University of Utah.
23: */
24:
25: #include <stdio.h>
26: #include <string.h>
27: #include <ctype.h>
28:
29: #include "obstack.h"
30: #include "as.h"
31: #include "frags.h"
32: #include "flonum.h"
33: #include "expr.h"
34: #include "hash.h"
35: #include "md.h"
36: #include "symbols.h"
37: #include "messages.h"
38: #include "hppa-aux.h"
39: #include "stuff/hppa.h"
40:
41: extern char *expr_end; /* defined in hppa.c */
42:
43: static const int print_errors = 1;
44:
45: static int reg_name_search(
46: char *name);
47:
48: int pa_parse_number(s)
49: char **s;
50: {
51: int num;
52: char *name;
53: char c;
54: symbolS *sym;
55: int status;
56: char * p = *s;
57:
58: while ( *p == ' ' || *p == '\t' )
59: p = p + 1;
60: num=-1; /* assume invalid number to begin with */
61: if (isdigit(*p)) {
62: num = 0; /* now we know it is a number */
63:
64: if ( *p == '0'
65: && ( *(p+1) == 'x' || *(p+1) == 'X' ) ) { /* hex input */
66: p = p + 2;
67: while ( isdigit(*p) || ( (*p >= 'a') && (*p <= 'f') )
68: || ( (*p >= 'A') && (*p <= 'F') ) ){
69: if ( isdigit(*p) )
70: num = num*16 + *p-'0';
71: else if ( *p >= 'a' && *p <= 'f' )
72: num = num*16 + *p-'a' + 10;
73: else
74: num = num*16 + *p-'A' + 10;
75: ++p;
76: }
77: }
78: else {
79: while (isdigit(*p)) {
80: num= num*10 + *p-'0';
81: ++p;
82: }
83: }
84: }
85: else if ( *p == '%' ) { /* could be a pre-defined register */
86: num = 0;
87: name = p;
88: p++;
89: c = *p;
90:
91: /*
92: * tege hack: Special case for general registers as the
93: * general code makes a binary search with case translation,
94: * and is VERY slow.
95: */
96: if (c == 'r') {
97: p++;
98: if (!isdigit(*p))
99: as_bad("Undefined register: '%s'. ASSUMING 0",name);
100: else {
101: do
102: num= num*10 + *p++ - '0';
103: while (isdigit(*p));
104: }
105: }
106: else {
107: while ( is_part_of_name(c) ) {
108: p = p + 1;
109: c = *p;
110: }
111: /* Terminate string with \0. Restore below. */
112: *p = 0;
113: status = reg_name_search(name);
114: if ( status >= 0 )
115: num = status;
116: else {
117: if ( print_errors )
118: as_bad("Undefined register: '%s'. ASSUMING 0",name);
119: else
120: num = -1;
121: }
122: /* Restore orignal value of string. */
123: *p = c;
124: }
125: }
126: else {
127: num = 0;
128: name = p;
129: c = *p;
130: while ( is_part_of_name(c) ) {
131: p = p + 1;
132: c = *p;
133: }
134: *p = 0;
135: if ( (sym = symbol_find(name)) != NULL ) {
136: if ( sym->sy_type == N_ABS && sym->sy_other == NO_SECT ) {
137: num = sym->sy_value;
138: }
139: else {
140: if ( print_errors )
141: as_bad("Non-absolute constant: '%s'. ASSUMING 0",name);
142: else
143: num = -1;
144: }
145: }
146: else {
147: if ( print_errors )
148: as_bad("Undefined absolute constant: '%s'. ASSUMING 0",name);
149: else
150: num = -1;
151: }
152: *p = c;
153: }
154:
155: *s = p;
156: return num;
157: }
158:
159: struct pd_reg {
160: char *name;
161: int value;
162: };
163:
164: /* List of registers that are pre-defined:
165:
166: General Registers:
167:
168: Name Value Name Value
169: %r0 0 %r16 16
170: %r1 1 %r17 17
171: %r2 2 %r18 18
172: %r3 3 %r19 19
173: %r4 4 %r20 20
174: %r5 5 %r21 21
175: %r6 6 %r22 22
176: %r7 7 %r23 23
177: %r8 8 %r24 24
178: %r9 9 %r25 25
179: %r10 10 %r26 26
180: %r11 11 %r27 27
181: %r12 12 %r28 28
182: %r13 13 %r29 29
183: %r14 14 %r30 30
184: %r15 15 %r31 31
185:
186: Floating-point Registers:
187: [NOTE: Also includes L and R versions of these (e.g. %fr19L, %fr19R)]
188:
189: Name Value Name Value
190: %fr0 0 %fr16 16
191: %fr1 1 %fr17 17
192: %fr2 2 %fr18 18
193: %fr3 3 %fr19 19
194: %fr4 4 %fr20 20
195: %fr5 5 %fr21 21
196: %fr6 6 %fr22 22
197: %fr7 7 %fr23 23
198: %fr8 8 %fr24 24
199: %fr9 9 %fr25 25
200: %fr10 10 %fr26 26
201: %fr11 11 %fr27 27
202: %fr12 12 %fr28 28
203: %fr13 13 %fr29 29
204: %fr14 14 %fr30 30
205: %fr15 15 %fr31 31
206:
207: Space Registers:
208:
209: Name Value Name Value
210: %sr0 0 %sr4 4
211: %sr1 1 %sr5 5
212: %sr2 2 %sr6 6
213: %sr3 3 %sr7 7
214:
215: Control registers and their synonyms:
216:
217: Names Value
218: %cr0 %rctr 0
219: %cr8 %pidr1 8
220: %cr9 %pidr2 9
221: %cr10 %ccr 10
222: %cr11 %sar 11
223: %cr12 %pidr3 12
224: %cr13 %pidr4 13
225: %cr14 %iva 14
226: %cr15 %eiem 15
227: %cr16 %itmr 16
228: %cr17 %pcsq 17
229: %cr18 %pcoq 18
230: %cr19 %iir 19
231: %cr20 %isr 20
232: %cr21 %ior 21
233: %cr22 %ipsw 22
234: %cr23 %eirr 23
235: %cr24 %tr0 %ppda 24
236: %cr25 %tr1 %hta 25
237: %cr26 %tr2 26
238: %cr27 %tr3 27
239: %cr28 %tr4 28
240: %cr29 %tr5 29
241: %cr30 %tr6 30
242: %cr31 %tr7 31
243:
244: */
245:
246: /* This table is sorted. Suitable for searching by a binary search. */
247:
248: static struct pd_reg pre_defined_registers[] = {
249: { "%ccr", 10 },
250: { "%cr0", 0 },
251: { "%cr10", 10 },
252: { "%cr11", 11 },
253: { "%cr12", 12 },
254: { "%cr13", 13 },
255: { "%cr14", 14 },
256: { "%cr15", 15 },
257: { "%cr16", 16 },
258: { "%cr17", 17 },
259: { "%cr18", 18 },
260: { "%cr19", 19 },
261: { "%cr20", 20 },
262: { "%cr21", 21 },
263: { "%cr22", 22 },
264: { "%cr23", 23 },
265: { "%cr24", 24 },
266: { "%cr25", 25 },
267: { "%cr26", 26 },
268: { "%cr27", 27 },
269: { "%cr28", 28 },
270: { "%cr29", 29 },
271: { "%cr30", 30 },
272: { "%cr31", 31 },
273: { "%cr8", 8 },
274: { "%cr9", 9 },
275: { "%eiem", 15 },
276: { "%eirr", 23 },
277: { "%fr0", 0 },
278: { "%fr0L", 0 },
279: { "%fr0R", 0 },
280: { "%fr1", 1 },
281: { "%fr10", 10 },
282: { "%fr10L", 10 },
283: { "%fr10R", 10 },
284: { "%fr11", 11 },
285: { "%fr11L", 11 },
286: { "%fr11R", 11 },
287: { "%fr12", 12 },
288: { "%fr12L", 12 },
289: { "%fr12R", 12 },
290: { "%fr13", 13 },
291: { "%fr13L", 13 },
292: { "%fr13R", 13 },
293: { "%fr14", 14 },
294: { "%fr14L", 14 },
295: { "%fr14R", 14 },
296: { "%fr15", 15 },
297: { "%fr15L", 15 },
298: { "%fr15R", 15 },
299: { "%fr16", 16 },
300: { "%fr16L", 16 },
301: { "%fr16R", 16 },
302: { "%fr17", 17 },
303: { "%fr17L", 17 },
304: { "%fr17R", 17 },
305: { "%fr18", 18 },
306: { "%fr18L", 18 },
307: { "%fr18R", 18 },
308: { "%fr19", 19 },
309: { "%fr19L", 19 },
310: { "%fr19R", 19 },
311: { "%fr1L", 1 },
312: { "%fr1R", 1 },
313: { "%fr2", 2 },
314: { "%fr20", 20 },
315: { "%fr20L", 20 },
316: { "%fr20R", 20 },
317: { "%fr21", 21 },
318: { "%fr21L", 21 },
319: { "%fr21R", 21 },
320: { "%fr22", 22 },
321: { "%fr22L", 22 },
322: { "%fr22R", 22 },
323: { "%fr23", 23 },
324: { "%fr23L", 23 },
325: { "%fr23R", 23 },
326: { "%fr24", 24 },
327: { "%fr24L", 24 },
328: { "%fr24R", 24 },
329: { "%fr25", 25 },
330: { "%fr25L", 25 },
331: { "%fr25R", 25 },
332: { "%fr26", 26 },
333: { "%fr26L", 26 },
334: { "%fr26R", 26 },
335: { "%fr27", 27 },
336: { "%fr27L", 27 },
337: { "%fr27R", 27 },
338: { "%fr28", 28 },
339: { "%fr28L", 28 },
340: { "%fr28R", 28 },
341: { "%fr29", 29 },
342: { "%fr29L", 29 },
343: { "%fr29R", 29 },
344: { "%fr2L", 2 },
345: { "%fr2R", 2 },
346: { "%fr3", 3 },
347: { "%fr30", 30 },
348: { "%fr30L", 30 },
349: { "%fr30R", 30 },
350: { "%fr31", 31 },
351: { "%fr31L", 31 },
352: { "%fr31R", 31 },
353: { "%fr3L", 3 },
354: { "%fr3R", 3 },
355: { "%fr4", 4 },
356: { "%fr4L", 4 },
357: { "%fr4R", 4 },
358: { "%fr5", 5 },
359: { "%fr5L", 5 },
360: { "%fr5R", 5 },
361: { "%fr6", 6 },
362: { "%fr6L", 6 },
363: { "%fr6R", 6 },
364: { "%fr7", 7 },
365: { "%fr7L", 7 },
366: { "%fr7R", 7 },
367: { "%fr8", 8 },
368: { "%fr8L", 8 },
369: { "%fr8R", 8 },
370: { "%fr9", 9 },
371: { "%fr9L", 9 },
372: { "%fr9R", 9 },
373: { "%hta", 25 },
374: { "%iir", 19 },
375: { "%ior", 21 },
376: { "%ipsw", 22 },
377: { "%isr", 20 },
378: { "%itmr", 16 },
379: { "%iva", 14 },
380: { "%pcoq", 18 },
381: { "%pcsq", 17 },
382: { "%pidr1", 8 },
383: { "%pidr2", 9 },
384: { "%pidr3", 12 },
385: { "%pidr4", 13 },
386: { "%ppda", 24 },
387: { "%r0", 0 },
388: { "%r1", 1 },
389: { "%r10", 10 },
390: { "%r11", 11 },
391: { "%r12", 12 },
392: { "%r13", 13 },
393: { "%r14", 14 },
394: { "%r15", 15 },
395: { "%r16", 16 },
396: { "%r17", 17 },
397: { "%r18", 18 },
398: { "%r19", 19 },
399: { "%r2", 2 },
400: { "%r20", 20 },
401: { "%r21", 21 },
402: { "%r22", 22 },
403: { "%r23", 23 },
404: { "%r24", 24 },
405: { "%r25", 25 },
406: { "%r26", 26 },
407: { "%r27", 27 },
408: { "%r28", 28 },
409: { "%r29", 29 },
410: { "%r3", 3 },
411: { "%r30", 30 },
412: { "%r31", 31 },
413: { "%r4", 4 },
414: { "%r4L", 4 },
415: { "%r4R", 4 },
416: { "%r5", 5 },
417: { "%r5L", 5 },
418: { "%r5R", 5 },
419: { "%r6", 6 },
420: { "%r6L", 6 },
421: { "%r6R", 6 },
422: { "%r7", 7 },
423: { "%r7L", 7 },
424: { "%r7R", 7 },
425: { "%r8", 8 },
426: { "%r8L", 8 },
427: { "%r8R", 8 },
428: { "%r9", 9 },
429: { "%r9L", 9 },
430: { "%r9R", 9 },
431: { "%rctr", 0 },
432: { "%sar", 11 },
433: { "%sr0", 0 },
434: { "%sr1", 1 },
435: { "%sr2", 2 },
436: { "%sr3", 3 },
437: { "%sr4", 4 },
438: { "%sr5", 5 },
439: { "%sr6", 6 },
440: { "%sr7", 7 },
441: { "%tr0", 24 },
442: { "%tr1", 25 },
443: { "%tr2", 26 },
444: { "%tr3", 27 },
445: { "%tr4", 28 },
446: { "%tr5", 9 },
447: { "%tr6", 30 },
448: { "%tr7", 31 }
449: };
450:
451: #define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg))
452:
453: static
454: int
455: reg_name_search(
456: char *name)
457: {
458: int x,l,r;
459:
460: l = 0;
461: r = REG_NAME_CNT - 1;
462:
463: do {
464: x = (l + r) / 2;
465: if (strcasecmp(name,pre_defined_registers[x].name) < 0)
466: r = x - 1;
467: else
468: l = x + 1;
469: } while ( !( (strcasecmp(name,pre_defined_registers[x].name) == 0) ||
470: (l > r) ) );
471:
472: if ( strcasecmp(name,pre_defined_registers[x].name) == 0 )
473: return(pre_defined_registers[x].value);
474: else
475: return(-1);
476:
477: }
478:
479: static
480: int
481: is_R_select(
482: char *s)
483: {
484:
485: if ( *s == 'R' || *s == 'r' )
486: return(TRUE);
487: else
488: return(FALSE);
489: }
490:
491: static
492: int
493: is_L_select(
494: char *s)
495: {
496:
497: if ( *s == 'L' || *s == 'l' )
498: return(TRUE);
499: else
500: return(FALSE);
501: }
502:
503: int need_89_opcode(insn,result)
504: struct pa_it *insn;
505: struct pa_89_fp_reg_struct *result;
506: {
507: if ( result->L_R_select == 1 && !(insn->fpof1 == DBL && insn->fpof2 == DBL) )
508: return TRUE;
509: else
510: return FALSE;
511: }
512:
513: int
514: pa_89_parse_number(s,result)
515: char **s;
516: struct pa_89_fp_reg_struct *result;
517: {
518: int num;
519: char *name;
520: char c;
521: symbolS *sym;
522: int status;
523: char * p = *s;
524:
525: while ( *p == ' ' || *p == '\t' )
526: p = p + 1;
527: num=-1; /* assume invalid number to begin with */
528: result->number_part = -1;
529: result->L_R_select = -1;
530:
531: if (isdigit(*p)) {
532: num = 0; /* now we know it is a number */
533:
534: if ( *p == '0' && ( *(p+1) == 'x' || *(p+1) == 'X' ) ) { /* hex input */
535: p = p + 2;
536: while ( isdigit(*p)
537: || ( (*p >= 'a') && (*p <= 'f') )
538: || ( (*p >= 'A') && (*p <= 'F') ) ){
539: if ( isdigit(*p) )
540: num = num*16 + *p-'0';
541: else if ( *p >= 'a' && *p <= 'f' )
542: num = num*16 + *p-'a' + 10;
543: else
544: num = num*16 + *p-'A' + 10;
545: ++p;
546: }
547: }
548: else {
549: while (isdigit(*p)) {
550: num= num*10 + *p-'0';
551: ++p;
552: }
553: }
554:
555: result->number_part = num;
556:
557: if ( is_R_select(p) ) {
558: result->L_R_select = 1;
559: ++p;
560: }
561: else if ( is_L_select(p) ) {
562: result->L_R_select = 0;
563: ++p;
564: }
565: else
566: result->L_R_select = 0;
567:
568: }
569: else if ( *p == '%' ) { /* could be a pre-defined register */
570: num = 0;
571: name = p;
572: p = p + 1;
573: c = *p;
574: /* tege hack: Special case for general registers
575: as the general code makes a binary search with case translation,
576: and is VERY slow. */
577: if (c == 'r') {
578: p++;
579: if (!isdigit(*p))
580: as_bad("Undefined register: '%s'. ASSUMING 0",name);
581: else {
582: do
583: num= num*10 + *p++ - '0';
584: while (isdigit(*p));
585: }
586: }
587: else {
588: while ( is_part_of_name(c) ) {
589: p = p + 1;
590: c = *p;
591: }
592: /* Terminate string with \0. Restore below. */
593: *p = 0;
594: status = reg_name_search(name);
595: if ( status >= 0 )
596: num = status;
597: else {
598: if ( print_errors )
599: as_bad("Undefined register: '%s'. ASSUMING 0",name);
600: else
601: num = -1;
602: }
603: *p = c;
604: }
605:
606: result->number_part = num;
607:
608: if ( is_R_select(p-1) )
609: result->L_R_select = 1;
610: else if ( is_L_select(p-1) )
611: result->L_R_select = 0;
612: else
613: result->L_R_select = 0;
614:
615: }
616: else {
617: num = 0;
618: name = p;
619: c = *p;
620: while ( is_part_of_name(c) ) {
621: p = p + 1;
622: c = *p;
623: }
624: *p = 0;
625: if ( (sym = symbol_find(name)) != NULL ) {
626: if ( sym->sy_type == N_ABS && sym->sy_other == NO_SECT ) {
627: num = sym->sy_value;
628: }
629: else {
630: if ( print_errors )
631: as_bad("Non-absolute constant: '%s'. ASSUMING 0",name);
632: else
633: num = -1;
634: }
635: }
636: else {
637: if ( print_errors )
638: as_bad("Undefined absolute constant: '%s'. ASSUMING 0",name);
639: else
640: num = -1;
641: }
642: *p = c;
643:
644: result->number_part = num;
645:
646: if ( is_R_select(p-1) ) {
647: result->L_R_select = 1;
648: }
649: else if ( is_L_select(p-1) ) {
650: result->L_R_select = 0;
651: }
652: else
653: result->L_R_select = 0;
654: }
655:
656: *s = p;
657: return num;
658:
659: }
660:
661: int pa_parse_fp_cmp_cond(s)
662: char **s;
663: {
664: int cond,i;
665: struct possibleS {
666: char *string;
667: int cond;
668: };
669:
670: /*
671: This table is sorted by order of the length of the string. This is so we
672: check for <> before we check for <. If we had a <> and checked for < first,
673: we would get a false match.
674: */
675: static struct possibleS poss[] =
676: {
677: { "false?", 0 },
678: { "false", 1 },
679: { "true?", 30 },
680: { "true", 31 },
681: { "!<=>", 3 },
682: { "!?>=", 8 },
683: { "!?<=", 16 },
684: { "!<>", 7 },
685: { "!>=", 11 },
686: { "!?>", 12 },
687: { "?<=", 14 },
688: { "!<=", 19 },
689: { "!?<", 20 },
690: { "?>=", 22 },
691: { "!?=", 24 },
692: { "!=t", 27 },
693: { "<=>", 29 },
694: { "=t", 5 },
695: { "?=", 6 },
696: { "?<", 10 },
697: { "<=", 13 },
698: { "!>", 15 },
699: { "?>", 18 },
700: { ">=", 21 },
701: { "!<", 23 },
702: { "<>", 25 },
703: { "!=", 26 },
704: { "!?", 28 },
705: { "?", 2 },
706: { "=", 4 },
707: { "<", 9 },
708: { ">", 17 }
709: };
710:
711: cond=0;
712:
713: for ( i = 0; i < 32; i++ ) {
714: if ( strncasecmp(*s,poss[i].string,strlen(poss[i].string)) == 0 ) {
715: cond = poss[i].cond;
716: *s += strlen(poss[i].string);
717: while ( **s == ' ' || **s == '\t' )
718: *s = *s + 1;
719: return cond;
720: }
721: }
722:
723: as_bad("Illegal FP Compare Condition: %c",**s);
724: return 0;
725: }
726:
727: FP_Operand_Format pa_parse_fp_format(s)
728: char **s;
729: {
730: int f;
731:
732: f = SGL;
733: if ( **s == ',' ) {
734: *s += 1;
735: if ( strncasecmp(*s,"sgl",3) == 0 ) {
736: f = SGL;
737: *s += 4;
738: }
739: else if ( strncasecmp(*s,"dbl",3) == 0 ) {
740: f = DBL;
741: *s += 4;
742: }
743: else if ( strncasecmp(*s,"quad",4) == 0 ) {
744: f = QUAD;
745: *s += 5;
746: }
747: else {
748: f = ILLEGAL_FMT;
749: as_bad("Unrecognized FP Operand Format: %3s",*s);
750: }
751: }
752: while ( **s == ' ' || **s == '\t' || **s == 0 )
753: *s = *s + 1;
754:
755: return f;
756: }
757:
758: int
759: getExpression(
760: char *str)
761: {
762: char *save_in;
763: segT seg;
764:
765: save_in = input_line_pointer;
766: input_line_pointer = str;
767: switch (seg = expression(&the_insn.exp)) {
768:
769: case SEG_ABSOLUTE:
770: case SEG_SECT:
771: case SEG_DIFFSECT:
772: case SEG_UNKNOWN:
773: case SEG_NONE:
774: case SEG_BIG:
775: break;
776:
777: default:
778: the_insn.error = "illegal segment";
779: expr_end = input_line_pointer;
780: input_line_pointer=save_in;
781: return 1;
782: }
783: expr_end = input_line_pointer;
784: input_line_pointer = save_in;
785: return 0;
786: }
787:
788: int
789: getAbsoluteExpression(
790: char *str)
791: {
792: char *save_in;
793: segT seg;
794:
795: for ( ; *str == ' ' || *str == '\t' ; str++)
796: ; /* do nothing */
797: save_in = input_line_pointer;
798: input_line_pointer = str;
799: switch (seg = expression(&the_insn.exp)) {
800: case SEG_ABSOLUTE:
801: break;
802: default:
803: the_insn.error = "segment should be ABSOLUTE";
804: expr_end = input_line_pointer;
805: input_line_pointer=save_in;
806: return 1;
807: }
808: expr_end = input_line_pointer;
809: input_line_pointer = save_in;
810: return 0;
811: }
812:
813: int
814: evaluateAbsolute(
815: expressionS exp,
816: int field_selector)
817: {
818: int value;
819: unsigned long left21, right14;
820:
821: value = exp.X_add_number;
822: calc_hppa_HILO(0, value, &left21, &right14);
823:
824: if ( exp.X_add_symbol ) {
825: value += exp.X_add_symbol->sy_value;
826: }
827: if ( exp.X_subtract_symbol ) {
828: value -= exp.X_subtract_symbol->sy_value;
829: }
830:
831: switch (field_selector) {
832: case /* no selector */ 0:
833: break;
834: case /* e_lsel */ 1: /* L` */
835: value = left21;
836: break;
837:
838: case /* e_rsel */ 2: /* R` */
839: value = right14;
840: break;
841: default:
842: BAD_CASE(field_selector);
843: break;
844: }
845: return value;
846: }
847:
848: int pa_parse_nullif(s)
849: char **s;
850: {
851: int nullif;
852:
853: nullif = 0;
854: if ( **s == ',' ) {
855: *s = *s + 1;
856: if ( strncasecmp(*s,"n",1) == 0 )
857: nullif = 1;
858: else {
859: as_bad("Unrecognized Nullification: (%c)",**s);
860: nullif = 0;
861: }
862: *s = *s + 1;
863: }
864: while ( **s == ' ' || **s == '\t' )
865: *s = *s + 1;
866:
867: return nullif;
868: }
869:
870: int pa_parse_nonneg_cmpsub_cmpltr(s)
871: char **s;
872: {
873: int cmpltr;
874: char *name;
875: char c;
876:
877: cmpltr = 0;
878: if ( **s == ',' ) {
879: *s+=1;
880: name = *s;
881: while ( **s != ',' && **s != ' ' && **s != '\t' )
882: *s += 1;
883: c = **s;
884: **s = 0x00;
885: if ( strcmp(name,"=") == 0 ) {
886: cmpltr = 1;
887: }
888: else if ( strcmp(name,"<") == 0 ) {
889: cmpltr = 2;
890: }
891: else if ( strcmp(name,"<=") == 0 ) {
892: cmpltr = 3;
893: }
894: else if ( strcmp(name,"<<") == 0 ) {
895: cmpltr = 4;
896: }
897: else if ( strcmp(name,"<<=") == 0 ) {
898: cmpltr = 5;
899: }
900: else if ( strcasecmp(name,"sv") == 0 ) {
901: cmpltr = 6;
902: }
903: else if ( strcasecmp(name,"od") == 0 ) {
904: cmpltr = 7;
905: }
906: else
907: cmpltr = -1;
908: **s = c;
909: }
910: if ( cmpltr >= 0 ) {
911: while ( **s == ' ' || **s == '\t' )
912: *s = *s + 1;
913: }
914:
915: return cmpltr;
916: }
917:
918: int pa_parse_neg_cmpsub_cmpltr(s)
919: char **s;
920: {
921: int cmpltr;
922: char *name;
923: char c;
924:
925: cmpltr = -1;
926: if ( **s == ',' ) {
927: *s+=1;
928: name = *s;
929: while ( **s != ',' && **s != ' ' && **s != '\t' )
930: *s += 1;
931: c = **s;
932: **s = 0x00;
933: if ( strcasecmp(name,"tr") == 0 ) {
934: cmpltr = 0;
935: }
936: else if ( strcmp(name,"<>") == 0 ) {
937: cmpltr = 1;
938: }
939: else if ( strcmp(name,">=") == 0 ) {
940: cmpltr = 2;
941: }
942: else if ( strcmp(name,">") == 0 ) {
943: cmpltr = 3;
944: }
945: else if ( strcmp(name,">>=") == 0 ) {
946: cmpltr = 4;
947: }
948: else if ( strcmp(name,">>") == 0 ) {
949: cmpltr = 5;
950: }
951: else if ( strcasecmp(name,"nsv") == 0 ) {
952: cmpltr = 6;
953: }
954: else if ( strcasecmp(name,"ev") == 0 ) {
955: cmpltr = 7;
956: }
957: **s = c;
958: }
959: if ( cmpltr >= 0 ) {
960: while ( **s == ' ' || **s == '\t' )
961: *s = *s + 1;
962: }
963:
964: return cmpltr;
965: }
966:
967: int pa_parse_nonneg_add_cmpltr(s)
968: char **s;
969: {
970: int cmpltr;
971: char *name;
972: char c;
973:
974: cmpltr = -1;
975: if ( **s == ',' ) {
976: *s+=1;
977: name = *s;
978: while ( **s != ',' && **s != ' ' && **s != '\t' )
979: *s += 1;
980: c = **s;
981: **s = 0x00;
982: if ( strcmp(name,"=") == 0 ) {
983: cmpltr = 1;
984: }
985: else if ( strcmp(name,"<") == 0 ) {
986: cmpltr = 2;
987: }
988: else if ( strcmp(name,"<=") == 0 ) {
989: cmpltr = 3;
990: }
991: else if ( strcasecmp(name,"nuv") == 0 ) {
992: cmpltr = 4;
993: }
994: else if ( strcasecmp(name,"znv") == 0 ) {
995: cmpltr = 5;
996: }
997: else if ( strcasecmp(name,"sv") == 0 ) {
998: cmpltr = 6;
999: }
1000: else if ( strcasecmp(name,"od") == 0 ) {
1001: cmpltr = 7;
1002: }
1003: **s = c;
1004: }
1005: if ( cmpltr >= 0 ) {
1006: while ( **s == ' ' || **s == '\t' )
1007: *s = *s + 1;
1008: }
1009:
1010: return cmpltr;
1011: }
1012:
1013: int pa_parse_neg_add_cmpltr(s)
1014: char **s;
1015: {
1016: int cmpltr;
1017: char *name;
1018: char c;
1019:
1020: cmpltr = -1;
1021: if ( **s == ',' ) {
1022: *s+=1;
1023: name = *s;
1024: while ( **s != ',' && **s != ' ' && **s != '\t' )
1025: *s += 1;
1026: c = **s;
1027: **s = 0x00;
1028: if ( strcasecmp(name,"tr") == 0 ) {
1029: cmpltr = 0;
1030: }
1031: else if ( strcmp(name,"<>") == 0 ) {
1032: cmpltr = 1;
1033: }
1034: else if ( strcmp(name,">=") == 0 ) {
1035: cmpltr = 2;
1036: }
1037: else if ( strcmp(name,">") == 0 ) {
1038: cmpltr = 3;
1039: }
1040: else if ( strcmp(name,"uv") == 0 ) {
1041: cmpltr = 4;
1042: }
1043: else if ( strcmp(name,"vnz") == 0 ) {
1044: cmpltr = 5;
1045: }
1046: else if ( strcasecmp(name,"nsv") == 0 ) {
1047: cmpltr = 6;
1048: }
1049: else if ( strcasecmp(name,"ev") == 0 ) {
1050: cmpltr = 7;
1051: }
1052: **s = c;
1053: }
1054: if ( cmpltr >= 0 ) {
1055: while ( **s == ' ' || **s == '\t' )
1056: *s = *s + 1;
1057: }
1058:
1059: return cmpltr;
1060: }
1061:
1062: static int
1063: is_same_frag(frag1P,frag2P)
1064: fragS *frag1P;
1065: fragS *frag2P;
1066: {
1067:
1068: if ( frag1P == NULL )
1069: return (FALSE);
1070: else if ( frag2P == NULL )
1071: return (FALSE);
1072: else if ( frag1P == frag2P )
1073: return (TRUE);
1074: else if ( frag2P->fr_type == rs_fill && frag2P->fr_fix == 0 )
1075: return is_same_frag(frag1P,frag2P->fr_next);
1076: else if ( frag2P->fr_type == rs_align )
1077: return is_same_frag(frag1P,frag2P->fr_next);
1078: else
1079: return (FALSE);
1080: }
1081:
1082: /* end hppa-aux.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.