* read.c (potable): Add balignw, balignl, p2alignw, and p2alignl.
[external/binutils.git] / gas / read.c
1 /* read.c - read a source file -
2    Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 1996
3    Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #if 0
22 #define MASK_CHAR (0xFF)        /* If your chars aren't 8 bits, you will
23                                    change this a bit.  But then, GNU isn't
24                                    spozed to run on your machine anyway.
25                                    (RMS is so shortsighted sometimes.)
26                                    */
27 #else
28 #define MASK_CHAR ((int)(unsigned char)-1)
29 #endif
30
31
32 /* This is the largest known floating point format (for now). It will
33    grow when we do 4361 style flonums. */
34
35 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
36
37 /* Routines that read assembler source text to build spagetti in memory.
38    Another group of these functions is in the expr.c module.  */
39
40 /* for isdigit() */
41 #include <ctype.h>
42
43 #include "as.h"
44 #include "subsegs.h"
45 #include "sb.h"
46 #include "macro.h"
47 #include "libiberty.h"
48 #include "obstack.h"
49 #include "listing.h"
50
51 #ifndef TC_START_LABEL
52 #define TC_START_LABEL(x,y) (x==':')
53 #endif
54
55 /* The NOP_OPCODE is for the alignment fill value.
56  * fill it a nop instruction so that the disassembler does not choke
57  * on it
58  */
59 #ifndef NOP_OPCODE
60 #define NOP_OPCODE 0x00
61 #endif
62
63 char *input_line_pointer;       /*->next char of source file to parse. */
64
65 int generate_asm_lineno = 0;    /* flag to generate line stab for .s file */
66
67 #if BITS_PER_CHAR != 8
68 /*  The following table is indexed by[(char)] and will break if
69     a char does not have exactly 256 states (hopefully 0:255!)!  */
70 die horribly;
71 #endif
72
73 #ifndef LEX_AT
74 /* The m88k unfortunately uses @ as a label beginner.  */
75 #define LEX_AT 0
76 #endif
77
78 #ifndef LEX_BR
79 /* The RS/6000 assembler uses {,},[,] as parts of symbol names.  */
80 #define LEX_BR 0
81 #endif
82
83 #ifndef LEX_PCT
84 /* The Delta 68k assembler permits % inside label names.  */
85 #define LEX_PCT 0
86 #endif
87
88 #ifndef LEX_QM
89 /* The PowerPC Windows NT assemblers permits ? inside label names.  */
90 #define LEX_QM 0
91 #endif
92
93 #ifndef LEX_DOLLAR
94 /* The a29k assembler does not permits labels to start with $.  */
95 #define LEX_DOLLAR 3
96 #endif
97
98 /* used by is_... macros. our ctype[] */
99 char lex_type[256] =
100 {
101   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* @ABCDEFGHIJKLMNO */
102   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* PQRSTUVWXYZ[\]^_ */
103   0, 0, 0, 0, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
104   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM,  /* 0123456789:;<=>? */
105   LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  /* @ABCDEFGHIJKLMNO */
106   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
107   0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,       /* `abcdefghijklmno */
108   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 0, /* pqrstuvwxyz{|}~. */
109   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 };
117
118
119 /*
120  * In: a character.
121  * Out: 1 if this character ends a line.
122  */
123 #define _ (0)
124 char is_end_of_line[256] =
125 {
126 #ifdef CR_EOL
127   _, _, _, _, _, _, _, _, _, _, 99, _, _, 99, _, _,     /* @abcdefghijklmno */
128 #else
129   _, _, _, _, _, _, _, _, _, _, 99, _, _, _, _, _,      /* @abcdefghijklmno */
130 #endif
131   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
132 #ifdef TC_HPPA
133   _,99, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* _!"#$%&'()*+,-./ */
134   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* 0123456789:;<=>? */
135 #else
136   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
137   _, _, _, _, _, _, _, _, _, _, _, 99, _, _, _, _,      /* 0123456789:;<=>? */
138 #endif
139   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
140   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
141   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
142   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
143   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
144   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
145   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
146   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
147   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,       /* */
148 };
149 #undef _
150
151 /* Functions private to this file. */
152
153 static char *buffer;    /* 1st char of each buffer of lines is here. */
154 static char *buffer_limit;      /*->1 + last char in buffer. */
155
156 #ifdef TARGET_BYTES_BIG_ENDIAN
157 /* Hack to deal with tc-*.h defining TARGET_BYTES_BIG_ENDIAN to empty
158    instead of to 0 or 1.  */
159 #if 5 - TARGET_BYTES_BIG_ENDIAN - 5 == 10
160 #undef  TARGET_BYTES_BIG_ENDIAN
161 #define TARGET_BYTES_BIG_ENDIAN 1
162 #endif
163 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
164 #else
165 int target_big_endian /* = 0 */;
166 #endif
167
168 static char *old_buffer;        /* JF a hack */
169 static char *old_input;
170 static char *old_limit;
171
172 /* Variables for handling include file directory list. */
173
174 char **include_dirs;    /* List of pointers to directories to
175                            search for .include's */
176 int include_dir_count;  /* How many are in the list */
177 int include_dir_maxlen = 1;/* Length of longest in list */
178
179 #ifndef WORKING_DOT_WORD
180 struct broken_word *broken_words;
181 int new_broken_words;
182 #endif
183
184 /* The current offset into the absolute section.  We don't try to
185    build frags in the absolute section, since no data can be stored
186    there.  We just keep track of the current offset.  */
187 addressT abs_section_offset;
188
189 /* If this line had an MRI style label, it is stored in this variable.
190    This is used by some of the MRI pseudo-ops.  */
191 symbolS *line_label;
192
193 /* This global variable is used to support MRI common sections.  We
194    translate such sections into a common symbol.  This variable is
195    non-NULL when we are in an MRI common section.  */
196 symbolS *mri_common_symbol;
197
198 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
199    need to align to an even byte boundary unless the next pseudo-op is
200    dc.b, ds.b, or dcb.b.  This variable is set to 1 if an alignment
201    may be needed.  */
202 static int mri_pending_align;
203
204 static int scrub_from_string PARAMS ((char **));
205 static void do_align PARAMS ((int, char *, int));
206 static int hex_float PARAMS ((int, char *));
207 static void do_org PARAMS ((segT, expressionS *, int));
208 char *demand_copy_string PARAMS ((int *lenP));
209 int is_it_end_of_statement PARAMS ((void));
210 static segT get_segmented_expression PARAMS ((expressionS *expP));
211 static segT get_known_segmented_expression PARAMS ((expressionS * expP));
212 static void pobegin PARAMS ((void));
213 static int get_line_sb PARAMS ((sb *));
214 \f
215
216 void
217 read_begin ()
218 {
219   const char *p;
220
221   pobegin ();
222   obj_read_begin_hook ();
223
224   /* Something close -- but not too close -- to a multiple of 1024.
225      The debugging malloc I'm using has 24 bytes of overhead.  */
226   obstack_begin (&notes, chunksize);
227   obstack_begin (&cond_obstack, chunksize);
228
229   /* Use machine dependent syntax */
230   for (p = line_separator_chars; *p; p++)
231     is_end_of_line[(unsigned char) *p] = 1;
232   /* Use more.  FIXME-SOMEDAY. */
233
234   if (flag_mri)
235     lex_type['?'] = 3;
236 }
237 \f
238 /* set up pseudo-op tables */
239
240 static struct hash_control *po_hash;
241
242 static const pseudo_typeS potable[] =
243 {
244   {"abort", s_abort, 0},
245   {"align", s_align_ptwo, 0},
246   {"ascii", stringer, 0},
247   {"asciz", stringer, 1},
248   {"balign", s_align_bytes, 0},
249   {"balignw", s_align_bytes, 2},
250   {"balignl", s_align_bytes, 4},
251 /* block */
252   {"byte", cons, 1},
253   {"comm", s_comm, 0},
254   {"common", s_mri_common, 0},
255   {"common.s", s_mri_common, 1},
256   {"data", s_data, 0},
257   {"dc", cons, 2},
258   {"dc.b", cons, 1},
259   {"dc.d", float_cons, 'd'},
260   {"dc.l", cons, 4},
261   {"dc.s", float_cons, 'f'},
262   {"dc.w", cons, 2},
263   {"dc.x", float_cons, 'x'},
264   {"dcb", s_space, 2},
265   {"dcb.b", s_space, 1},
266   {"dcb.d", s_float_space, 'd'},
267   {"dcb.l", s_space, 4},
268   {"dcb.s", s_float_space, 'f'},
269   {"dcb.w", s_space, 2},
270   {"dcb.x", s_float_space, 'x'},
271   {"ds", s_space, 2},
272   {"ds.b", s_space, 1},
273   {"ds.d", s_space, 8},
274   {"ds.l", s_space, 4},
275   {"ds.p", s_space, 12},
276   {"ds.s", s_space, 4},
277   {"ds.w", s_space, 2},
278   {"ds.x", s_space, 12},
279   {"debug", s_ignore, 0},
280 #ifdef S_SET_DESC
281   {"desc", s_desc, 0},
282 #endif
283 /* dim */
284   {"double", float_cons, 'd'},
285 /* dsect */
286   {"eject", listing_eject, 0},  /* Formfeed listing */
287   {"else", s_else, 0},
288   {"elsec", s_else, 0},
289   {"end", s_end, 0},
290   {"endc", s_endif, 0},
291   {"endif", s_endif, 0},
292 /* endef */
293   {"equ", s_set, 0},
294   {"err", s_err, 0},
295   {"exitm", s_mexit, 0},
296 /* extend */
297   {"extern", s_ignore, 0},      /* We treat all undef as ext */
298   {"appfile", s_app_file, 1},
299   {"appline", s_app_line, 0},
300   {"fail", s_fail, 0},
301   {"file", s_app_file, 0},
302   {"fill", s_fill, 0},
303   {"float", float_cons, 'f'},
304   {"format", s_ignore, 0},
305   {"global", s_globl, 0},
306   {"globl", s_globl, 0},
307   {"hword", cons, 2},
308   {"if", s_if, (int) O_ne},
309   {"ifc", s_ifc, 0},
310   {"ifdef", s_ifdef, 0},
311   {"ifeq", s_if, (int) O_eq},
312   {"ifeqs", s_ifeqs, 0},
313   {"ifge", s_if, (int) O_ge},
314   {"ifgt", s_if, (int) O_gt},
315   {"ifle", s_if, (int) O_le},
316   {"iflt", s_if, (int) O_lt},
317   {"ifnc", s_ifc, 1},
318   {"ifndef", s_ifdef, 1},
319   {"ifne", s_if, (int) O_ne},
320   {"ifnes", s_ifeqs, 1},
321   {"ifnotdef", s_ifdef, 1},
322   {"include", s_include, 0},
323   {"int", cons, 4},
324   {"irp", s_irp, 0},
325   {"irep", s_irp, 0},
326   {"irpc", s_irp, 1},
327   {"irepc", s_irp, 1},
328   {"lcomm", s_lcomm, 0},
329   {"lflags", listing_flags, 0}, /* Listing flags */
330   {"list", listing_list, 1},    /* Turn listing on */
331   {"llen", listing_psize, 1},
332   {"long", cons, 4},
333   {"lsym", s_lsym, 0},
334   {"macro", s_macro, 0},
335   {"mexit", s_mexit, 0},
336   {"name", s_ignore, 0},
337   {"noformat", s_ignore, 0},
338   {"nolist", listing_list, 0},  /* Turn listing off */
339   {"nopage", listing_nopage, 0},
340   {"octa", cons, 16},
341   {"offset", s_struct, 0},
342   {"org", s_org, 0},
343   {"p2align", s_align_ptwo, 0},
344   {"p2alignw", s_align_ptwo, 2},
345   {"p2alignl", s_align_ptwo, 4},
346   {"page", listing_eject, 0},
347   {"plen", listing_psize, 0},
348   {"print", s_print, 0},
349   {"psize", listing_psize, 0},  /* set paper size */
350   {"purgem", s_purgem, 0},
351   {"quad", cons, 8},
352   {"rep", s_rept, 0},
353   {"rept", s_rept, 0},
354   {"rva", s_rva, 4},
355   {"sbttl", listing_title, 1},  /* Subtitle of listing */
356 /* scl */
357 /* sect */
358   {"set", s_set, 0},
359   {"short", cons, 2},
360   {"single", float_cons, 'f'},
361 /* size */
362   {"space", s_space, 0},
363   {"spc", s_ignore, 0},
364   {"stabd", s_stab, 'd'},
365   {"stabn", s_stab, 'n'},
366   {"stabs", s_stab, 's'},
367   {"string", stringer, 1},
368   {"struct", s_struct, 0},
369 /* tag */
370   {"text", s_text, 0},
371
372   /* This is for gcc to use.  It's only just been added (2/94), so gcc
373      won't be able to use it for a while -- probably a year or more.
374      But once this has been released, check with gcc maintainers
375      before deleting it or even changing the spelling.  */
376   {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
377   /* If we're folding case -- done for some targets, not necessarily
378      all -- the above string in an input file will be converted to
379      this one.  Match it either way...  */
380   {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
381
382   {"title", listing_title, 0},  /* Listing title */
383   {"ttl", listing_title, 0},
384 /* type */
385 /* use */
386 /* val */
387   {"xcom", s_comm, 0},
388   {"xdef", s_globl, 0},
389   {"xref", s_ignore, 0},
390   {"xstabs", s_xstab, 's'},
391   {"word", cons, 2},
392   {"zero", s_space, 0},
393   {NULL}                        /* end sentinel */
394 };
395
396 static int pop_override_ok = 0;
397 static const char *pop_table_name;
398
399 void
400 pop_insert (table)
401      const pseudo_typeS *table;
402 {
403   const char *errtxt;
404   const pseudo_typeS *pop;
405   for (pop = table; pop->poc_name; pop++)
406     {
407       errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
408       if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
409         as_fatal ("error constructing %s pseudo-op table: %s", pop_table_name,
410                   errtxt);
411     }
412 }
413
414 #ifndef md_pop_insert
415 #define md_pop_insert()         pop_insert(md_pseudo_table)
416 #endif
417
418 #ifndef obj_pop_insert
419 #define obj_pop_insert()        pop_insert(obj_pseudo_table)
420 #endif
421
422 static void 
423 pobegin ()
424 {
425   po_hash = hash_new ();
426
427   /* Do the target-specific pseudo ops. */
428   pop_table_name = "md";
429   md_pop_insert ();
430
431   /* Now object specific.  Skip any that were in the target table. */
432   pop_table_name = "obj";
433   pop_override_ok = 1;
434   obj_pop_insert ();
435
436   /* Now portable ones.  Skip any that we've seen already. */
437   pop_table_name = "standard";
438   pop_insert (potable);
439 }
440 \f
441 #define HANDLE_CONDITIONAL_ASSEMBLY()                                   \
442   if (ignore_input ())                                                  \
443     {                                                                   \
444       while (! is_end_of_line[(unsigned char) *input_line_pointer++])   \
445         if (input_line_pointer == buffer_limit)                         \
446           break;                                                        \
447       continue;                                                         \
448     }
449
450
451 /* This function is used when scrubbing the characters between #APP
452    and #NO_APP.  */
453
454 static char *scrub_string;
455 static char *scrub_string_end;
456
457 static int
458 scrub_from_string (from)
459      char **from;
460 {
461   int size;
462
463   *from = scrub_string;
464   size = scrub_string_end - scrub_string;
465   scrub_string = scrub_string_end;
466   return size;
467 }
468
469 /*      read_a_source_file()
470  *
471  * We read the file, putting things into a web that
472  * represents what we have been reading.
473  */
474 void 
475 read_a_source_file (name)
476      char *name;
477 {
478   register char c;
479   register char *s;             /* string of symbol, '\0' appended */
480   register int temp;
481   pseudo_typeS *pop;
482
483   buffer = input_scrub_new_file (name);
484
485   listing_file (name);
486   listing_newline ("");
487
488   while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
489     {                           /* We have another line to parse. */
490       know (buffer_limit[-1] == '\n');  /* Must have a sentinel. */
491     contin:                     /* JF this goto is my fault I admit it.
492                                    Someone brave please re-write the whole
493                                    input section here?  Pleeze???  */
494       while (input_line_pointer < buffer_limit)
495         {
496           /* We have more of this buffer to parse. */
497
498           /*
499            * We now have input_line_pointer->1st char of next line.
500            * If input_line_pointer [-1] == '\n' then we just
501            * scanned another line: so bump line counters.
502            */
503           if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
504             {
505 #ifdef md_start_line_hook
506               md_start_line_hook ();
507 #endif
508
509               if (input_line_pointer[-1] == '\n')
510                 bump_line_counters ();
511
512               line_label = NULL;
513
514               if (flag_m68k_mri
515 #ifdef LABELS_WITHOUT_COLONS
516                   || 1
517 #endif
518                   )
519                 {
520                   /* Text at the start of a line must be a label, we
521                      run down and stick a colon in.  */
522                   if (is_name_beginner (*input_line_pointer))
523                     {
524                       char *line_start = input_line_pointer;
525                       char c;
526
527                       HANDLE_CONDITIONAL_ASSEMBLY ();
528
529                       c = get_symbol_end ();
530
531                       /* In MRI mode, the EQU pseudoop must be
532                          handled specially.  */
533                       if (flag_m68k_mri)
534                         {
535                           char *rest = input_line_pointer + 1;
536
537                           if (*rest == ':')
538                             ++rest;
539                           if (*rest == ' ' || *rest == '\t')
540                             ++rest;
541                           if ((strncasecmp (rest, "EQU", 3) == 0
542                                || strncasecmp (rest, "SET", 3) == 0)
543                               && (rest[3] == ' ' || rest[3] == '\t'))
544                             {
545                               input_line_pointer = rest + 3;
546                               equals (line_start);
547                               continue;
548                             }
549                         }
550
551                       line_label = colon (line_start);
552
553                       *input_line_pointer = c;
554                       if (c == ':')
555                         input_line_pointer++;
556                     }
557                 }
558             }
559
560           /*
561            * We are at the begining of a line, or similar place.
562            * We expect a well-formed assembler statement.
563            * A "symbol-name:" is a statement.
564            *
565            * Depending on what compiler is used, the order of these tests
566            * may vary to catch most common case 1st.
567            * Each test is independent of all other tests at the (top) level.
568            * PLEASE make a compiler that doesn't use this assembler.
569            * It is crufty to waste a compiler's time encoding things for this
570            * assembler, which then wastes more time decoding it.
571            * (And communicating via (linear) files is silly!
572            * If you must pass stuff, please pass a tree!)
573            */
574           if ((c = *input_line_pointer++) == '\t'
575               || c == ' '
576               || c == '\f'
577               || c == 0)
578             {
579               c = *input_line_pointer++;
580             }
581           know (c != ' ');      /* No further leading whitespace. */
582           LISTING_NEWLINE ();
583           /*
584            * C is the 1st significant character.
585            * Input_line_pointer points after that character.
586            */
587           if (is_name_beginner (c))
588             {
589               /* want user-defined label or pseudo/opcode */
590               HANDLE_CONDITIONAL_ASSEMBLY ();
591
592               s = --input_line_pointer;
593               c = get_symbol_end ();    /* name's delimiter */
594               /*
595                * C is character after symbol.
596                * That character's place in the input line is now '\0'.
597                * S points to the beginning of the symbol.
598                *   [In case of pseudo-op, s->'.'.]
599                * Input_line_pointer->'\0' where c was.
600                */
601               if (TC_START_LABEL(c, input_line_pointer))
602                 {
603                   if (flag_m68k_mri)
604                     {
605                       char *rest = input_line_pointer + 1;
606
607                       /* In MRI mode, \tsym: set 0 is permitted.  */
608
609                       if (*rest == ':')
610                         ++rest;
611                       if (*rest == ' ' || *rest == '\t')
612                         ++rest;
613                       if ((strncasecmp (rest, "EQU", 3) == 0
614                            || strncasecmp (rest, "SET", 3) == 0)
615                           && (rest[3] == ' ' || rest[3] == '\t'))
616                         {
617                           input_line_pointer = rest + 3;
618                           equals (s);
619                           continue;
620                         }
621                     }
622
623                   line_label = colon (s);       /* user-defined label */
624                   *input_line_pointer++ = ':';  /* Put ':' back for error messages' sake. */
625                   /* Input_line_pointer->after ':'. */
626                   SKIP_WHITESPACE ();
627
628
629                 }
630               else if (c == '='
631                        || (input_line_pointer[1] == '='
632 #ifdef TC_EQUAL_IN_INSN
633                            && ! TC_EQUAL_IN_INSN (c, input_line_pointer)
634 #endif
635                            ))
636                 {
637                   equals (s);
638                   demand_empty_rest_of_line ();
639                 }
640               else
641                 {               /* expect pseudo-op or machine instruction */
642                   pop = NULL;
643
644 #define IGNORE_OPCODE_CASE
645 #ifdef IGNORE_OPCODE_CASE
646                   {
647                     char *s2 = s;
648                     while (*s2)
649                       {
650                         if (isupper (*s2))
651                           *s2 = tolower (*s2);
652                         s2++;
653                       }
654                   }
655 #endif
656
657                   if (flag_m68k_mri
658 #ifdef NO_PSEUDO_DOT
659                       || 1
660 #endif
661                       )
662                     {
663                       /* The MRI assembler and the m88k use pseudo-ops
664                          without a period.  */
665                       pop = (pseudo_typeS *) hash_find (po_hash, s);
666                       if (pop != NULL && pop->poc_handler == NULL)
667                         pop = NULL;
668                     }
669
670                   if (pop != NULL
671                       || (! flag_m68k_mri && *s == '.'))
672                     {
673                       /*
674                        * PSEUDO - OP.
675                        *
676                        * WARNING: c has next char, which may be end-of-line.
677                        * We lookup the pseudo-op table with s+1 because we
678                        * already know that the pseudo-op begins with a '.'.
679                        */
680
681                       if (pop == NULL)
682                         pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
683
684                       /* In MRI mode, we may need to insert an
685                          automatic alignment directive.  What a hack
686                          this is.  */
687                       if (mri_pending_align
688                           && (pop == NULL
689                               || ! ((pop->poc_handler == cons
690                                      && pop->poc_val == 1)
691                                     || (pop->poc_handler == s_space
692                                         && pop->poc_val == 1))))
693                         {
694                           do_align (1, (char *) NULL, 0);
695                           mri_pending_align = 0;
696                         }
697
698                       /* Print the error msg now, while we still can */
699                       if (pop == NULL)
700                         {
701                           as_bad ("Unknown pseudo-op:  `%s'", s);
702                           *input_line_pointer = c;
703                           s_ignore (0);
704                           continue;
705                         }
706
707                       /* Put it back for error messages etc. */
708                       *input_line_pointer = c;
709                       /* The following skip of whitespace is compulsory.
710                          A well shaped space is sometimes all that separates
711                          keyword from operands. */
712                       if (c == ' ' || c == '\t')
713                         input_line_pointer++;
714                       /*
715                        * Input_line is restored.
716                        * Input_line_pointer->1st non-blank char
717                        * after pseudo-operation.
718                        */
719                       (*pop->poc_handler) (pop->poc_val);
720
721                       /* If that was .end, just get out now.  */
722                       if (pop->poc_handler == s_end)
723                         goto quit;
724                     }
725                   else
726                     {           /* machine instruction */
727                       int inquote = 0;
728
729                       if (mri_pending_align)
730                         {
731                           do_align (1, (char *) NULL, 0);
732                           mri_pending_align = 0;
733                         }
734
735                       /* WARNING: c has char, which may be end-of-line. */
736                       /* Also: input_line_pointer->`\0` where c was. */
737                       *input_line_pointer = c;
738                       while (!is_end_of_line[(unsigned char) *input_line_pointer]
739                              || inquote
740 #ifdef TC_EOL_IN_INSN
741                              || TC_EOL_IN_INSN (input_line_pointer)
742 #endif
743                              )
744                         {
745                           if (flag_m68k_mri && *input_line_pointer == '\'')
746                             inquote = ! inquote;
747                           input_line_pointer++;
748                         }
749
750                       c = *input_line_pointer;
751                       *input_line_pointer = '\0';
752
753 #ifdef OBJ_GENERATE_ASM_LINENO
754                       if (generate_asm_lineno == 0)
755                         {
756                           if (ecoff_no_current_file ())
757                             generate_asm_lineno = 1;
758                         }
759                       if (generate_asm_lineno == 1)
760                         {
761                           unsigned int lineno;
762                           char *s;
763
764                           as_where (&s, &lineno);
765                           OBJ_GENERATE_ASM_LINENO (s, lineno);
766                         }
767 #endif
768
769                       if (macro_defined)
770                         {
771                           sb out;
772                           const char *err;
773
774                           if (check_macro (s, &out, '\0', &err))
775                             {
776                               if (err != NULL)
777                                 as_bad (err);
778                               *input_line_pointer++ = c;
779                               input_scrub_include_sb (&out,
780                                                       input_line_pointer);
781                               sb_kill (&out);
782                               buffer_limit =
783                                 input_scrub_next_buffer (&input_line_pointer);
784                               continue;
785                             }
786                         }
787
788                       md_assemble (s);  /* Assemble 1 instruction. */
789
790                       *input_line_pointer++ = c;
791
792                       /* We resume loop AFTER the end-of-line from
793                          this instruction. */
794                     }           /* if (*s=='.') */
795                 }               /* if c==':' */
796               continue;
797             }                   /* if (is_name_beginner(c) */
798
799
800           /* Empty statement?  */
801           if (is_end_of_line[(unsigned char) c])
802             continue;
803
804           if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB)
805               && isdigit (c))
806             {
807               /* local label  ("4:") */
808               char *backup = input_line_pointer;
809
810               HANDLE_CONDITIONAL_ASSEMBLY ();
811
812               temp = c - '0';
813
814               while (isdigit (*input_line_pointer))
815                 {
816                   temp = (temp * 10) + *input_line_pointer - '0';
817                   ++input_line_pointer;
818                 }               /* read the whole number */
819
820               if (LOCAL_LABELS_DOLLAR
821                   && *input_line_pointer == '$'
822                   && *(input_line_pointer + 1) == ':')
823                 {
824                   input_line_pointer += 2;
825
826                   if (dollar_label_defined (temp))
827                     {
828                       as_fatal ("label \"%d$\" redefined", temp);
829                     }
830
831                   define_dollar_label (temp);
832                   colon (dollar_label_name (temp, 0));
833                   continue;
834                 }
835
836               if (LOCAL_LABELS_FB
837                   && *input_line_pointer++ == ':')
838                 {
839                   fb_label_instance_inc (temp);
840                   colon (fb_label_name (temp, 0));
841                   continue;
842                 }
843
844               input_line_pointer = backup;
845             }                   /* local label  ("4:") */
846
847           if (c && strchr (line_comment_chars, c))
848             {                   /* Its a comment.  Better say APP or NO_APP */
849               char *ends;
850               char *new_buf;
851               char *new_tmp;
852               unsigned int new_length;
853               char *tmp_buf = 0;
854
855               bump_line_counters ();
856               s = input_line_pointer;
857               if (strncmp (s, "APP\n", 4))
858                 continue;       /* We ignore it */
859               s += 4;
860
861               ends = strstr (s, "#NO_APP\n");
862
863               if (!ends)
864                 {
865                   unsigned int tmp_len;
866                   unsigned int num;
867
868                   /* The end of the #APP wasn't in this buffer.  We
869                      keep reading in buffers until we find the #NO_APP
870                      that goes with this #APP  There is one.  The specs
871                      guarentee it. . . */
872                   tmp_len = buffer_limit - s;
873                   tmp_buf = xmalloc (tmp_len + 1);
874                   memcpy (tmp_buf, s, tmp_len);
875                   do
876                     {
877                       new_tmp = input_scrub_next_buffer (&buffer);
878                       if (!new_tmp)
879                         break;
880                       else
881                         buffer_limit = new_tmp;
882                       input_line_pointer = buffer;
883                       ends = strstr (buffer, "#NO_APP\n");
884                       if (ends)
885                         num = ends - buffer;
886                       else
887                         num = buffer_limit - buffer;
888
889                       tmp_buf = xrealloc (tmp_buf, tmp_len + num);
890                       memcpy (tmp_buf + tmp_len, buffer, num);
891                       tmp_len += num;
892                     }
893                   while (!ends);
894
895                   input_line_pointer = ends ? ends + 8 : NULL;
896
897                   s = tmp_buf;
898                   ends = s + tmp_len;
899
900                 }
901               else
902                 {
903                   input_line_pointer = ends + 8;
904                 }
905
906               scrub_string = s;
907               scrub_string_end = ends;
908
909               new_length = ends - s;
910               new_buf = (char *) xmalloc (new_length);
911               new_tmp = new_buf;
912               for (;;)
913                 {
914                   int space;
915                   int size;
916
917                   space = (new_buf + new_length) - new_tmp;
918                   size = do_scrub_chars (scrub_from_string, new_tmp, space);
919
920                   if (size < space)
921                     {
922                       new_tmp += size;
923                       break;
924                     }
925
926                   new_buf = xrealloc (new_buf, new_length + 100);
927                   new_tmp = new_buf + new_length;
928                   new_length += 100;
929                 }
930
931               if (tmp_buf)
932                 free (tmp_buf);
933               old_buffer = buffer;
934               old_input = input_line_pointer;
935               old_limit = buffer_limit;
936               buffer = new_buf;
937               input_line_pointer = new_buf;
938               buffer_limit = new_tmp;
939               continue;
940             }
941
942           HANDLE_CONDITIONAL_ASSEMBLY ();
943
944 #ifdef tc_unrecognized_line
945           if (tc_unrecognized_line (c))
946             continue;
947 #endif
948
949           /* as_warn("Junk character %d.",c);  Now done by ignore_rest */
950           input_line_pointer--; /* Report unknown char as ignored. */
951           ignore_rest_of_line ();
952         }                       /* while (input_line_pointer<buffer_limit) */
953
954 #ifdef md_after_pass_hook
955       md_after_pass_hook ();
956 #endif
957
958       if (old_buffer)
959         {
960           free (buffer);
961           bump_line_counters ();
962           if (old_input != 0)
963             {
964               buffer = old_buffer;
965               input_line_pointer = old_input;
966               buffer_limit = old_limit;
967               old_buffer = 0;
968               goto contin;
969             }
970         }
971     }                           /* while (more buffers to scan) */
972
973  quit:
974   input_scrub_close ();         /* Close the input file */
975 }
976
977 /* For most MRI pseudo-ops, the line actually ends at the first
978    nonquoted space.  This function looks for that point, stuffs a null
979    in, and sets *STOPCP to the character that used to be there, and
980    returns the location.
981
982    Until I hear otherwise, I am going to assume that this is only true
983    for the m68k MRI assembler.  */
984
985 char *
986 mri_comment_field (stopcp)
987      char *stopcp;
988 {
989 #ifdef TC_M68K
990
991   char *s;
992   int inquote = 0;
993
994   know (flag_m68k_mri);
995
996   for (s = input_line_pointer;
997        ((! is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
998         || inquote);
999        s++)
1000     {
1001       if (*s == '\'')
1002         inquote = ! inquote;
1003     }
1004   *stopcp = *s;
1005   *s = '\0';
1006   return s;
1007
1008 #else
1009
1010   char *s;
1011
1012   for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
1013     ;
1014   *stopcp = *s;
1015   *s = '\0';
1016   return s;
1017
1018 #endif
1019
1020 }
1021
1022 /* Skip to the end of an MRI comment field.  */
1023
1024 void
1025 mri_comment_end (stop, stopc)
1026      char *stop;
1027      int stopc;
1028 {
1029   know (flag_mri);
1030
1031   input_line_pointer = stop;
1032   *stop = stopc;
1033   while (! is_end_of_line[(unsigned char) *input_line_pointer])
1034     ++input_line_pointer;
1035 }
1036
1037 void 
1038 s_abort (ignore)
1039      int ignore;
1040 {
1041   as_fatal (".abort detected.  Abandoning ship.");
1042 }
1043
1044 /* Guts of .align directive.  */
1045 static void 
1046 do_align (n, fill, len)
1047      int n;
1048      char *fill;
1049      int len;
1050 {
1051 #ifdef md_do_align
1052   md_do_align (n, fill, len, just_record_alignment);
1053 #endif
1054   if (!fill)
1055     {
1056       /* @@ Fix this right for BFD!  */
1057       static char zero;
1058       static char nop_opcode = NOP_OPCODE;
1059
1060       if (now_seg != data_section && now_seg != bss_section)
1061         {
1062           fill = &nop_opcode;
1063         }
1064       else
1065         {
1066           fill = &zero;
1067         }
1068       len = 1;
1069     }
1070
1071   /* Only make a frag if we HAVE to. . . */
1072   if (n && !need_pass_2)
1073     {
1074       if (len <= 1)
1075         frag_align (n, *fill);
1076       else
1077         frag_align_pattern (n, fill, len);
1078     }
1079
1080 #ifdef md_do_align
1081  just_record_alignment:
1082 #endif
1083
1084   record_alignment (now_seg, n);
1085 }
1086
1087 /* For machines where ".align 4" means align to a 4 byte boundary. */
1088 void 
1089 s_align_bytes (arg)
1090      int arg;
1091 {
1092   register unsigned int temp;
1093   char temp_fill;
1094   unsigned int i = 0;
1095   unsigned long max_alignment = 1 << 15;
1096   char *stop = NULL;
1097   char stopc;
1098
1099   if (flag_mri)
1100     stop = mri_comment_field (&stopc);
1101
1102   if (is_end_of_line[(unsigned char) *input_line_pointer])
1103     temp = arg;                 /* Default value from pseudo-op table */
1104   else
1105     temp = get_absolute_expression ();
1106
1107   if (temp > max_alignment)
1108     {
1109       as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
1110     }
1111
1112   /* For the sparc, `.align (1<<n)' actually means `.align n' so we
1113      have to convert it.  */
1114   if (temp != 0)
1115     {
1116       for (i = 0; (temp & 1) == 0; temp >>= 1, ++i)
1117         ;
1118     }
1119   if (temp != 1)
1120     as_bad ("Alignment not a power of 2");
1121
1122   temp = i;
1123   if (*input_line_pointer == ',')
1124     {
1125       offsetT fillval;
1126
1127       input_line_pointer++;
1128       fillval = get_absolute_expression ();
1129       if (arg == 0)
1130         arg = 1;
1131       if (arg <= 1)
1132         {
1133           temp_fill = fillval;
1134           do_align (temp, &temp_fill, arg);
1135         }
1136       else
1137         {
1138           char ab[16];
1139
1140           if (arg > sizeof ab)
1141             abort ();
1142           md_number_to_chars (ab, fillval, arg);
1143           do_align (temp, ab, arg);
1144         }
1145     }
1146   else
1147     {
1148       if (arg > 0)
1149         as_warn ("expected fill pattern missing");
1150       do_align (temp, (char *) NULL, 0);
1151     }
1152
1153   if (flag_mri)
1154     mri_comment_end (stop, stopc);
1155
1156   demand_empty_rest_of_line ();
1157 }
1158
1159 /* For machines where ".align 4" means align to 2**4 boundary. */
1160 void 
1161 s_align_ptwo (arg)
1162      int arg;
1163 {
1164   register int temp;
1165   char temp_fill;
1166   long max_alignment = 15;
1167   char *stop = NULL;
1168   char stopc;
1169
1170   if (flag_mri)
1171     stop = mri_comment_field (&stopc);
1172
1173   temp = get_absolute_expression ();
1174   if (temp > max_alignment)
1175     as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
1176   else if (temp < 0)
1177     {
1178       as_bad ("Alignment negative. 0 assumed.");
1179       temp = 0;
1180     }
1181   if (*input_line_pointer == ',')
1182     {
1183       offsetT fillval;
1184
1185       input_line_pointer++;
1186       fillval = get_absolute_expression ();
1187       if (arg == 0)
1188         arg = 1;
1189       if (arg <= 1)
1190         {
1191           temp_fill = fillval;
1192           do_align (temp, &temp_fill, arg);
1193         }
1194       else
1195         {
1196           char ab[16];
1197
1198           if (arg > sizeof ab)
1199             abort ();
1200           md_number_to_chars (ab, fillval, arg);
1201           do_align (temp, ab, arg);
1202         }
1203     }
1204   else
1205     {
1206       if (arg > 0)
1207         as_warn ("expected fill pattern missing");
1208       do_align (temp, (char *) NULL, 0);
1209     }
1210
1211   if (flag_mri)
1212     mri_comment_end (stop, stopc);
1213
1214   demand_empty_rest_of_line ();
1215 }
1216
1217 void 
1218 s_comm (ignore)
1219      int ignore;
1220 {
1221   register char *name;
1222   register char c;
1223   register char *p;
1224   offsetT temp;
1225   register symbolS *symbolP;
1226   char *stop = NULL;
1227   char stopc;
1228
1229   if (flag_mri)
1230     stop = mri_comment_field (&stopc);
1231
1232   name = input_line_pointer;
1233   c = get_symbol_end ();
1234   /* just after name is now '\0' */
1235   p = input_line_pointer;
1236   *p = c;
1237   SKIP_WHITESPACE ();
1238   if (*input_line_pointer != ',')
1239     {
1240       as_bad ("Expected comma after symbol-name: rest of line ignored.");
1241       if (flag_mri)
1242         mri_comment_end (stop, stopc);
1243       ignore_rest_of_line ();
1244       return;
1245     }
1246   input_line_pointer++;         /* skip ',' */
1247   if ((temp = get_absolute_expression ()) < 0)
1248     {
1249       as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp);
1250       if (flag_mri)
1251         mri_comment_end (stop, stopc);
1252       ignore_rest_of_line ();
1253       return;
1254     }
1255   *p = 0;
1256   symbolP = symbol_find_or_make (name);
1257   *p = c;
1258   if (S_IS_DEFINED (symbolP))
1259     {
1260       as_bad ("Ignoring attempt to re-define symbol `%s'.",
1261               S_GET_NAME (symbolP));
1262       if (flag_mri)
1263         mri_comment_end (stop, stopc);
1264       ignore_rest_of_line ();
1265       return;
1266     }
1267   if (S_GET_VALUE (symbolP))
1268     {
1269       if (S_GET_VALUE (symbolP) != (valueT) temp)
1270         as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
1271                 S_GET_NAME (symbolP),
1272                 (long) S_GET_VALUE (symbolP),
1273                 (long) temp);
1274     }
1275   else
1276     {
1277       S_SET_VALUE (symbolP, (valueT) temp);
1278       S_SET_EXTERNAL (symbolP);
1279     }
1280 #ifdef OBJ_VMS
1281   {
1282     extern int flag_one;
1283     if ( (!temp) || !flag_one)
1284       S_GET_OTHER(symbolP) = const_flag;
1285   }
1286 #endif /* not OBJ_VMS */
1287   know (symbolP->sy_frag == &zero_address_frag);
1288
1289   if (flag_mri)
1290     mri_comment_end (stop, stopc);
1291
1292   demand_empty_rest_of_line ();
1293 }                               /* s_comm() */
1294
1295 /* The MRI COMMON pseudo-op.  We handle this by creating a common
1296    symbol with the appropriate name.  We make s_space do the right
1297    thing by increasing the size.  */
1298
1299 void
1300 s_mri_common (small)
1301      int small;
1302 {
1303   char *name;
1304   char c;
1305   char *alc = NULL;
1306   symbolS *sym;
1307   offsetT align;
1308   char *stop = NULL;
1309   char stopc;
1310
1311   if (! flag_mri)
1312     {
1313       s_comm (0);
1314       return;
1315     }
1316
1317   stop = mri_comment_field (&stopc);
1318
1319   SKIP_WHITESPACE ();
1320
1321   name = input_line_pointer;
1322   if (! isdigit ((unsigned char) *name))
1323     c = get_symbol_end ();
1324   else
1325     {
1326       do
1327         {
1328           ++input_line_pointer;
1329         }
1330       while (isdigit ((unsigned char) *input_line_pointer));
1331       c = *input_line_pointer;
1332       *input_line_pointer = '\0';
1333
1334       if (line_label != NULL)
1335         {
1336           alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
1337                                   + (input_line_pointer - name)
1338                                   + 1);
1339           sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1340           name = alc;
1341         }
1342     }
1343
1344   sym = symbol_find_or_make (name);
1345   *input_line_pointer = c;
1346   if (alc != NULL)
1347     free (alc);
1348
1349   if (*input_line_pointer != ',')
1350     align = 0;
1351   else
1352     {
1353       ++input_line_pointer;
1354       align = get_absolute_expression ();
1355     }
1356
1357   if (S_IS_DEFINED (sym))
1358     {
1359 #if defined (S_IS_COMMON) || defined (BFD_ASSEMBLER)
1360       if (! S_IS_COMMON (sym))
1361 #endif
1362         {
1363           as_bad ("attempt to re-define symbol `%s'", S_GET_NAME (sym));
1364           mri_comment_end (stop, stopc);
1365           ignore_rest_of_line ();
1366           return;
1367         }
1368     }
1369
1370   S_SET_EXTERNAL (sym);
1371   mri_common_symbol = sym;
1372
1373 #ifdef S_SET_ALIGN
1374   if (align != 0)
1375     S_SET_ALIGN (sym, align);
1376 #endif
1377
1378   if (line_label != NULL)
1379     {
1380       line_label->sy_value.X_op = O_symbol;
1381       line_label->sy_value.X_add_symbol = sym;
1382       line_label->sy_value.X_add_number = S_GET_VALUE (sym);
1383       line_label->sy_frag = &zero_address_frag;
1384       S_SET_SEGMENT (line_label, expr_section);
1385     }
1386
1387   /* FIXME: We just ignore the small argument, which distinguishes
1388      COMMON and COMMON.S.  I don't know what we can do about it.  */
1389
1390   /* Ignore the type and hptype.  */
1391   if (*input_line_pointer == ',')
1392     input_line_pointer += 2;
1393   if (*input_line_pointer == ',')
1394     input_line_pointer += 2;
1395
1396   mri_comment_end (stop, stopc);
1397
1398   demand_empty_rest_of_line ();
1399 }
1400
1401 void
1402 s_data (ignore)
1403      int ignore;
1404 {
1405   segT section;
1406   register int temp;
1407
1408   temp = get_absolute_expression ();
1409   if (flag_readonly_data_in_text)
1410     {
1411       section = text_section;
1412       temp += 1000;
1413     }
1414   else
1415     section = data_section;
1416
1417   subseg_set (section, (subsegT) temp);
1418
1419 #ifdef OBJ_VMS
1420   const_flag = 0;
1421 #endif
1422   demand_empty_rest_of_line ();
1423 }
1424
1425 /* Handle the .appfile pseudo-op.  This is automatically generated by
1426    do_scrub_chars when a preprocessor # line comment is seen with a
1427    file name.  This default definition may be overridden by the object
1428    or CPU specific pseudo-ops.  This function is also the default
1429    definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1430    .file.  */
1431
1432 void 
1433 s_app_file (appfile)
1434      int appfile;
1435 {
1436   register char *s;
1437   int length;
1438
1439   /* Some assemblers tolerate immediately following '"' */
1440   if ((s = demand_copy_string (&length)) != 0)
1441     {
1442       /* If this is a fake .appfile, a fake newline was inserted into
1443          the buffer.  Passing -2 to new_logical_line tells it to
1444          account for it.  */
1445       new_logical_line (s, appfile ? -2 : -1);
1446
1447       /* In MRI mode, the preprocessor may have inserted an extraneous
1448          backquote.  */
1449       if (flag_m68k_mri
1450           && *input_line_pointer == '\''
1451           && is_end_of_line[(unsigned char) input_line_pointer[1]])
1452         ++input_line_pointer;
1453
1454       demand_empty_rest_of_line ();
1455 #ifdef LISTING
1456       if (listing)
1457         listing_source_file (s);
1458 #endif
1459     }
1460 #ifdef obj_app_file
1461   obj_app_file (s);
1462 #endif
1463 }
1464
1465 /* Handle the .appline pseudo-op.  This is automatically generated by
1466    do_scrub_chars when a preprocessor # line comment is seen.  This
1467    default definition may be overridden by the object or CPU specific
1468    pseudo-ops.  */
1469
1470 void
1471 s_app_line (ignore)
1472      int ignore;
1473 {
1474   int l;
1475
1476   /* The given number is that of the next line.  */
1477   l = get_absolute_expression () - 1;
1478   if (l < 0)
1479     /* Some of the back ends can't deal with non-positive line numbers.
1480        Besides, it's silly.  */
1481     as_warn ("Line numbers must be positive; line number %d rejected.", l+1);
1482   else
1483     {
1484       new_logical_line ((char *) NULL, l);
1485 #ifdef LISTING
1486       if (listing)
1487         listing_source_line (l);
1488 #endif
1489     }
1490   demand_empty_rest_of_line ();
1491 }
1492
1493 /* Handle the .end pseudo-op.  Actually, the real work is done in
1494    read_a_source_file.  */
1495
1496 void
1497 s_end (ignore)
1498      int ignore;
1499 {
1500   if (flag_mri)
1501     {
1502       /* The MRI assembler permits the start symbol to follow .end,
1503          but we don't support that.  */
1504       SKIP_WHITESPACE ();
1505       if (! is_end_of_line[(unsigned char) *input_line_pointer]
1506           && *input_line_pointer != '*'
1507           && *input_line_pointer != '!')
1508         as_warn ("start address not supported");
1509     }
1510 }
1511
1512 /* Handle the .err pseudo-op.  */
1513
1514 void
1515 s_err (ignore)
1516      int ignore;
1517 {
1518   as_bad (".err encountered");
1519   demand_empty_rest_of_line ();
1520 }
1521
1522 /* Handle the MRI fail pseudo-op.  */
1523
1524 void
1525 s_fail (ignore)
1526      int ignore;
1527 {
1528   offsetT temp;
1529   char *stop = NULL;
1530   char stopc;
1531
1532   if (flag_mri)
1533     stop = mri_comment_field (&stopc);
1534
1535   temp = get_absolute_expression ();
1536   if (temp >= 500)
1537     as_warn (".fail %ld encountered", (long) temp);
1538   else
1539     as_bad (".fail %ld encountered", (long) temp);
1540
1541   if (flag_mri)
1542     mri_comment_end (stop, stopc);
1543
1544   demand_empty_rest_of_line ();
1545 }
1546
1547 void 
1548 s_fill (ignore)
1549      int ignore;
1550 {
1551   long temp_repeat = 0;
1552   long temp_size = 1;
1553   register long temp_fill = 0;
1554   char *p;
1555
1556 #ifdef md_flush_pending_output
1557   md_flush_pending_output ();
1558 #endif
1559
1560   temp_repeat = get_absolute_expression ();
1561   if (*input_line_pointer == ',')
1562     {
1563       input_line_pointer++;
1564       temp_size = get_absolute_expression ();
1565       if (*input_line_pointer == ',')
1566         {
1567           input_line_pointer++;
1568           temp_fill = get_absolute_expression ();
1569         }
1570     }
1571   /* This is to be compatible with BSD 4.2 AS, not for any rational reason.  */
1572 #define BSD_FILL_SIZE_CROCK_8 (8)
1573   if (temp_size > BSD_FILL_SIZE_CROCK_8)
1574     {
1575       as_warn (".fill size clamped to %d.", BSD_FILL_SIZE_CROCK_8);
1576       temp_size = BSD_FILL_SIZE_CROCK_8;
1577     }
1578   if (temp_size < 0)
1579     {
1580       as_warn ("Size negative: .fill ignored.");
1581       temp_size = 0;
1582     }
1583   else if (temp_repeat <= 0)
1584     {
1585       as_warn ("Repeat < 0, .fill ignored");
1586       temp_size = 0;
1587     }
1588
1589   if (temp_size && !need_pass_2)
1590     {
1591       p = frag_var (rs_fill, (int) temp_size, (int) temp_size, (relax_substateT) 0, (symbolS *) 0, temp_repeat, (char *) 0);
1592       memset (p, 0, (unsigned int) temp_size);
1593       /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1594        * flavoured AS.  The following bizzare behaviour is to be
1595        * compatible with above.  I guess they tried to take up to 8
1596        * bytes from a 4-byte expression and they forgot to sign
1597        * extend. Un*x Sux. */
1598 #define BSD_FILL_SIZE_CROCK_4 (4)
1599       md_number_to_chars (p, (valueT) temp_fill,
1600                           (temp_size > BSD_FILL_SIZE_CROCK_4
1601                            ? BSD_FILL_SIZE_CROCK_4
1602                            : (int) temp_size));
1603       /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1604        * but emits no error message because it seems a legal thing to do.
1605        * It is a degenerate case of .fill but could be emitted by a compiler.
1606        */
1607     }
1608   demand_empty_rest_of_line ();
1609 }
1610
1611 void 
1612 s_globl (ignore)
1613      int ignore;
1614 {
1615   char *name;
1616   int c;
1617   symbolS *symbolP;
1618   char *stop = NULL;
1619   char stopc;
1620
1621   if (flag_mri)
1622     stop = mri_comment_field (&stopc);
1623
1624   do
1625     {
1626       name = input_line_pointer;
1627       c = get_symbol_end ();
1628       symbolP = symbol_find_or_make (name);
1629       *input_line_pointer = c;
1630       SKIP_WHITESPACE ();
1631       S_SET_EXTERNAL (symbolP);
1632       if (c == ',')
1633         {
1634           input_line_pointer++;
1635           SKIP_WHITESPACE ();
1636           if (*input_line_pointer == '\n')
1637             c = '\n';
1638         }
1639     }
1640   while (c == ',');
1641
1642   if (flag_mri)
1643     mri_comment_end (stop, stopc);
1644
1645   demand_empty_rest_of_line ();
1646 }
1647
1648 /* Handle the MRI IRP and IRPC pseudo-ops.  */
1649
1650 void
1651 s_irp (irpc)
1652      int irpc;
1653 {
1654   char *file;
1655   unsigned int line;
1656   sb s;
1657   const char *err;
1658   sb out;
1659
1660   as_where (&file, &line);
1661
1662   sb_new (&s);
1663   while (! is_end_of_line[(unsigned char) *input_line_pointer])
1664     sb_add_char (&s, *input_line_pointer++);
1665
1666   sb_new (&out);
1667
1668   err = expand_irp (irpc, 0, &s, &out, get_line_sb, '\0');
1669   if (err != NULL)
1670     as_bad_where (file, line, "%s", err);
1671
1672   sb_kill (&s);
1673
1674   input_scrub_include_sb (&out, input_line_pointer);
1675   sb_kill (&out);
1676   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1677 }
1678
1679 void 
1680 s_lcomm (needs_align)
1681      /* 1 if this was a ".bss" directive, which may require a 3rd argument
1682         (alignment); 0 if it was an ".lcomm" (2 args only)  */
1683      int needs_align;
1684 {
1685   register char *name;
1686   register char c;
1687   register char *p;
1688   register int temp;
1689   register symbolS *symbolP;
1690   segT current_seg = now_seg;
1691   subsegT current_subseg = now_subseg;
1692   const int max_alignment = 15;
1693   int align = 0;
1694   segT bss_seg = bss_section;
1695
1696   name = input_line_pointer;
1697   c = get_symbol_end ();
1698   p = input_line_pointer;
1699   *p = c;
1700   SKIP_WHITESPACE ();
1701
1702   /* Accept an optional comma after the name.  The comma used to be
1703      required, but Irix 5 cc does not generate it.  */
1704   if (*input_line_pointer == ',')
1705     {
1706       ++input_line_pointer;
1707       SKIP_WHITESPACE ();
1708     }
1709
1710   if (*input_line_pointer == '\n')
1711     {
1712       as_bad ("Missing size expression");
1713       return;
1714     }
1715
1716   if ((temp = get_absolute_expression ()) < 0)
1717     {
1718       as_warn ("BSS length (%d.) <0! Ignored.", temp);
1719       ignore_rest_of_line ();
1720       return;
1721     }
1722
1723 #if defined (TC_MIPS) || defined (TC_ALPHA)
1724   if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
1725       || OUTPUT_FLAVOR == bfd_target_elf_flavour)
1726     {
1727       /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss.  */
1728       if (temp <= bfd_get_gp_size (stdoutput))
1729         {
1730           bss_seg = subseg_new (".sbss", 1);
1731           seg_info (bss_seg)->bss = 1;
1732         }
1733     }
1734 #endif
1735    if (!needs_align)
1736      {
1737        /* FIXME. This needs to be machine independent. */
1738        if (temp >= 8)
1739          align = 3;
1740        else if (temp >= 4)
1741          align = 2;
1742        else if (temp >= 2)
1743          align = 1;
1744        else
1745          align = 0;
1746
1747        record_alignment(bss_seg, align);
1748      }
1749
1750   if (needs_align)
1751     {
1752       align = 0;
1753       SKIP_WHITESPACE ();
1754       if (*input_line_pointer != ',')
1755         {
1756           as_bad ("Expected comma after size");
1757           ignore_rest_of_line ();
1758           return;
1759         }
1760       input_line_pointer++;
1761       SKIP_WHITESPACE ();
1762       if (*input_line_pointer == '\n')
1763         {
1764           as_bad ("Missing alignment");
1765           return;
1766         }
1767       align = get_absolute_expression ();
1768       if (align > max_alignment)
1769         {
1770           align = max_alignment;
1771           as_warn ("Alignment too large: %d. assumed.", align);
1772         }
1773       else if (align < 0)
1774         {
1775           align = 0;
1776           as_warn ("Alignment negative. 0 assumed.");
1777         }
1778       record_alignment (bss_seg, align);
1779     }                           /* if needs align */
1780   else
1781     {
1782       /* Assume some objects may require alignment on some systems.  */
1783 #ifdef TC_ALPHA
1784       if (temp > 1)
1785         {
1786           align = ffs (temp) - 1;
1787           if (temp % (1 << align))
1788             abort ();
1789         }
1790 #endif
1791     }
1792
1793   *p = 0;
1794   symbolP = symbol_find_or_make (name);
1795   *p = c;
1796
1797   if (
1798 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
1799        S_GET_OTHER (symbolP) == 0 &&
1800        S_GET_DESC (symbolP) == 0 &&
1801 #endif /* OBJ_AOUT or OBJ_BOUT */
1802        (S_GET_SEGMENT (symbolP) == bss_seg
1803         || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0)))
1804     {
1805       char *pfrag;
1806
1807       subseg_set (bss_seg, 1);
1808
1809       if (align)
1810         frag_align (align, 0);
1811                                         /* detach from old frag */
1812       if (S_GET_SEGMENT (symbolP) == bss_seg)
1813         symbolP->sy_frag->fr_symbol = NULL;
1814
1815       symbolP->sy_frag = frag_now;
1816       pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
1817                         temp, (char *)0);
1818       *pfrag = 0;
1819
1820       S_SET_SEGMENT (symbolP, bss_seg);
1821
1822 #ifdef OBJ_COFF
1823       /* The symbol may already have been created with a preceding
1824          ".globl" directive -- be careful not to step on storage class
1825          in that case.  Otherwise, set it to static. */
1826       if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
1827         {
1828           S_SET_STORAGE_CLASS (symbolP, C_STAT);
1829         }
1830 #endif /* OBJ_COFF */
1831
1832 #ifdef S_SET_SIZE
1833       S_SET_SIZE (symbolP, temp);
1834 #endif
1835     }
1836   else
1837     as_bad ("Ignoring attempt to re-define symbol `%s'.",
1838             S_GET_NAME (symbolP));
1839
1840   subseg_set (current_seg, current_subseg);
1841
1842   demand_empty_rest_of_line ();
1843 }                               /* s_lcomm() */
1844
1845 void 
1846 s_lsym (ignore)
1847      int ignore;
1848 {
1849   register char *name;
1850   register char c;
1851   register char *p;
1852   expressionS exp;
1853   register symbolS *symbolP;
1854
1855   /* we permit ANY defined expression: BSD4.2 demands constants */
1856   name = input_line_pointer;
1857   c = get_symbol_end ();
1858   p = input_line_pointer;
1859   *p = c;
1860   SKIP_WHITESPACE ();
1861   if (*input_line_pointer != ',')
1862     {
1863       *p = 0;
1864       as_bad ("Expected comma after name \"%s\"", name);
1865       *p = c;
1866       ignore_rest_of_line ();
1867       return;
1868     }
1869   input_line_pointer++;
1870   expression (&exp);
1871   if (exp.X_op != O_constant
1872       && exp.X_op != O_register)
1873     {
1874       as_bad ("bad expression");
1875       ignore_rest_of_line ();
1876       return;
1877     }
1878   *p = 0;
1879   symbolP = symbol_find_or_make (name);
1880
1881   /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
1882      symbolP->sy_desc == 0) out of this test because coff doesn't have
1883      those fields, and I can't see when they'd ever be tripped.  I
1884      don't think I understand why they were here so I may have
1885      introduced a bug. As recently as 1.37 didn't have this test
1886      anyway.  xoxorich. */
1887
1888   if (S_GET_SEGMENT (symbolP) == undefined_section
1889       && S_GET_VALUE (symbolP) == 0)
1890     {
1891       /* The name might be an undefined .global symbol; be sure to
1892          keep the "external" bit. */
1893       S_SET_SEGMENT (symbolP,
1894                      (exp.X_op == O_constant
1895                       ? absolute_section
1896                       : reg_section));
1897       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
1898     }
1899   else
1900     {
1901       as_bad ("Symbol %s already defined", name);
1902     }
1903   *p = c;
1904   demand_empty_rest_of_line ();
1905 }                               /* s_lsym() */
1906
1907 /* Read a line into an sb.  */
1908
1909 static int
1910 get_line_sb (line)
1911      sb *line;
1912 {
1913   if (input_line_pointer >= buffer_limit)
1914     {
1915       buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1916       if (buffer_limit == 0)
1917         return 0;
1918     }
1919
1920   while (! is_end_of_line[(unsigned char) *input_line_pointer])
1921     sb_add_char (line, *input_line_pointer++);
1922   while (input_line_pointer < buffer_limit
1923          && is_end_of_line[(unsigned char) *input_line_pointer])
1924     {
1925       if (*input_line_pointer == '\n')
1926         {
1927           bump_line_counters ();
1928           LISTING_NEWLINE ();
1929         }
1930       ++input_line_pointer;
1931     }
1932   return 1;
1933 }
1934
1935 /* Define a macro.  This is an interface to macro.c, which is shared
1936    between gas and gasp.  */
1937
1938 void
1939 s_macro (ignore)
1940      int ignore;
1941 {
1942   char *file;
1943   unsigned int line;
1944   sb s;
1945   sb label;
1946   const char *err;
1947
1948   as_where (&file, &line);
1949
1950   sb_new (&s);
1951   while (! is_end_of_line[(unsigned char) *input_line_pointer])
1952     sb_add_char (&s, *input_line_pointer++);
1953
1954   sb_new (&label);
1955   if (line_label != NULL)
1956     sb_add_string (&label, S_GET_NAME (line_label));
1957
1958   demand_empty_rest_of_line ();
1959
1960   err = define_macro (0, &s, &label, get_line_sb);
1961   if (err != NULL)
1962     as_bad_where (file, line, "%s", err);
1963   else
1964     {
1965       if (line_label != NULL)
1966         {
1967           S_SET_SEGMENT (line_label, undefined_section);
1968           S_SET_VALUE (line_label, 0);
1969           line_label->sy_frag = &zero_address_frag;
1970         }
1971     }
1972
1973   sb_kill (&s);
1974 }
1975
1976 /* Handle the .mexit pseudo-op, which immediately exits a macro
1977    expansion.  */
1978
1979 void
1980 s_mexit (ignore)
1981      int ignore;
1982 {
1983   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1984 }
1985
1986 /* Handle changing the location counter.  */
1987
1988 static void
1989 do_org (segment, exp, fill)
1990      segT segment;
1991      expressionS *exp;
1992      int fill;
1993 {
1994   if (segment != now_seg && segment != absolute_section)
1995     as_bad ("invalid segment \"%s\"; segment \"%s\" assumed",
1996             segment_name (segment), segment_name (now_seg));
1997
1998   if (now_seg == absolute_section)
1999     {
2000       if (fill != 0)
2001         as_warn ("ignoring fill value in absolute section");
2002       if (exp->X_op != O_constant)
2003         {
2004           as_bad ("only constant offsets supported in absolute section");
2005           exp->X_add_number = 0;
2006         }
2007       abs_section_offset = exp->X_add_number;
2008     }
2009   else
2010     {
2011       char *p;
2012
2013       p = frag_var (rs_org, 1, 1, (relax_substateT) 0, exp->X_add_symbol,
2014                     exp->X_add_number, (char *) NULL);
2015       *p = fill;
2016     }
2017 }
2018
2019 void 
2020 s_org (ignore)
2021      int ignore;
2022 {
2023   register segT segment;
2024   expressionS exp;
2025   register long temp_fill;
2026
2027   /* The m68k MRI assembler has a different meaning for .org.  It
2028      means to create an absolute section at a given address.  We can't
2029      support that--use a linker script instead.  */
2030   if (flag_m68k_mri)
2031     {
2032       as_bad ("MRI style ORG pseudo-op not supported");
2033       ignore_rest_of_line ();
2034       return;
2035     }
2036
2037   /* Don't believe the documentation of BSD 4.2 AS.  There is no such
2038      thing as a sub-segment-relative origin.  Any absolute origin is
2039      given a warning, then assumed to be segment-relative.  Any
2040      segmented origin expression ("foo+42") had better be in the right
2041      segment or the .org is ignored.
2042
2043      BSD 4.2 AS warns if you try to .org backwards. We cannot because
2044      we never know sub-segment sizes when we are reading code.  BSD
2045      will crash trying to emit negative numbers of filler bytes in
2046      certain .orgs. We don't crash, but see as-write for that code.
2047
2048      Don't make frag if need_pass_2==1.  */
2049   segment = get_known_segmented_expression (&exp);
2050   if (*input_line_pointer == ',')
2051     {
2052       input_line_pointer++;
2053       temp_fill = get_absolute_expression ();
2054     }
2055   else
2056     temp_fill = 0;
2057
2058   if (!need_pass_2)
2059     do_org (segment, &exp, temp_fill);
2060
2061   demand_empty_rest_of_line ();
2062 }                               /* s_org() */
2063
2064 /* Handle parsing for the MRI SECT/SECTION pseudo-op.  This should be
2065    called by the obj-format routine which handles section changing
2066    when in MRI mode.  It will create a new section, and return it.  It
2067    will set *TYPE to the section type: one of '\0' (unspecified), 'C'
2068    (code), 'D' (data), 'M' (mixed), or 'R' (romable).  If
2069    BFD_ASSEMBLER is defined, the flags will be set in the section.  */
2070
2071 void
2072 s_mri_sect (type)
2073      char *type;
2074 {
2075 #ifdef TC_M68K
2076
2077   char *name;
2078   char c;
2079   segT seg;
2080
2081   SKIP_WHITESPACE ();
2082   
2083   name = input_line_pointer;
2084   if (! isdigit ((unsigned char) *name))
2085     c = get_symbol_end ();
2086   else
2087     {
2088       do
2089         {
2090           ++input_line_pointer;
2091         }
2092       while (isdigit ((unsigned char) *input_line_pointer));
2093       c = *input_line_pointer;
2094       *input_line_pointer = '\0';
2095     }
2096
2097   name = strdup (name);
2098   if (name == NULL)
2099     as_fatal ("virtual memory exhausted");
2100
2101   *input_line_pointer = c;
2102
2103   seg = subseg_new (name, 0);
2104
2105   if (*input_line_pointer == ',')
2106     {
2107       int align;
2108
2109       ++input_line_pointer;
2110       align = get_absolute_expression ();
2111       record_alignment (seg, align);
2112     }
2113
2114   *type = '\0';
2115   if (*input_line_pointer == ',')
2116     {
2117       c = *++input_line_pointer;
2118       c = toupper ((unsigned char) c);
2119       if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2120         *type = c;
2121       else
2122         as_bad ("unrecognized section type");
2123       ++input_line_pointer;
2124
2125 #ifdef BFD_ASSEMBLER
2126       {
2127         flagword flags;
2128
2129         flags = SEC_NO_FLAGS;
2130         if (*type == 'C')
2131           flags = SEC_CODE;
2132         else if (*type == 'D')
2133           flags = SEC_DATA;
2134         else if (*type == 'R')
2135           flags = SEC_ROM;
2136         if (flags != SEC_NO_FLAGS)
2137           {
2138             if (! bfd_set_section_flags (stdoutput, seg, flags))
2139               as_warn ("error setting flags for \"%s\": %s",
2140                        bfd_section_name (stdoutput, seg),
2141                        bfd_errmsg (bfd_get_error ()));
2142           }
2143       }
2144 #endif
2145     }
2146
2147   /* Ignore the HP type.  */
2148   if (*input_line_pointer == ',')
2149     input_line_pointer += 2;
2150
2151   demand_empty_rest_of_line ();
2152
2153 #else /* ! TC_M68K */
2154 #ifdef TC_I960
2155
2156   char *name;
2157   char c;
2158   segT seg;
2159
2160   SKIP_WHITESPACE ();
2161
2162   name = input_line_pointer;
2163   c = get_symbol_end ();
2164
2165   name = strdup (name);
2166   if (name == NULL)
2167     as_fatal ("virtual memory exhausted");
2168
2169   *input_line_pointer = c;
2170
2171   seg = subseg_new (name, 0);
2172
2173   if (*input_line_pointer != ',')
2174     *type = 'C';
2175   else
2176     {
2177       char *sectype;
2178
2179       ++input_line_pointer;
2180       SKIP_WHITESPACE ();
2181       sectype = input_line_pointer;
2182       c = get_symbol_end ();
2183       if (*sectype == '\0')
2184         *type = 'C';
2185       else if (strcasecmp (sectype, "text") == 0)
2186         *type = 'C';
2187       else if (strcasecmp (sectype, "data") == 0)
2188         *type = 'D';
2189       else if (strcasecmp (sectype, "romdata") == 0)
2190         *type = 'R';
2191       else
2192         as_warn ("unrecognized section type `%s'", sectype);
2193       *input_line_pointer = c;
2194     }
2195
2196   if (*input_line_pointer == ',')
2197     {
2198       char *seccmd;
2199
2200       ++input_line_pointer;
2201       SKIP_WHITESPACE ();
2202       seccmd = input_line_pointer;
2203       c = get_symbol_end ();
2204       if (strcasecmp (seccmd, "absolute") == 0)
2205         {
2206           as_bad ("absolute sections are not supported");
2207           *input_line_pointer = c;
2208           ignore_rest_of_line ();
2209           return;
2210         }
2211       else if (strcasecmp (seccmd, "align") == 0)
2212         {
2213           int align;
2214
2215           *input_line_pointer = c;
2216           align = get_absolute_expression ();
2217           record_alignment (seg, align);
2218         }
2219       else
2220         {
2221           as_warn ("unrecognized section command `%s'", seccmd);
2222           *input_line_pointer = c;
2223         }
2224     }
2225
2226   demand_empty_rest_of_line ();   
2227
2228 #else /* ! TC_I960 */
2229   /* The MRI assembler seems to use different forms of .sect for
2230      different targets.  */
2231   abort ();
2232 #endif /* ! TC_I960 */
2233 #endif /* ! TC_M68K */
2234 }
2235
2236 /* Handle the .print pseudo-op.  */
2237
2238 void
2239 s_print (ignore)
2240      int ignore;
2241 {
2242   char *s;
2243   int len;
2244
2245   s = demand_copy_C_string (&len);
2246   printf ("%s\n", s);
2247   demand_empty_rest_of_line ();
2248 }
2249
2250 /* Handle the .purgem pseudo-op.  */
2251
2252 void
2253 s_purgem (ignore)
2254      int ignore;
2255 {
2256   if (is_it_end_of_statement ())
2257     {
2258       demand_empty_rest_of_line ();
2259       return;
2260     }
2261
2262   do
2263     {
2264       char *name;
2265       char c;
2266
2267       SKIP_WHITESPACE ();
2268       name = input_line_pointer;
2269       c = get_symbol_end ();
2270       delete_macro (name);
2271       *input_line_pointer = c;
2272       SKIP_WHITESPACE ();
2273     }
2274   while (*input_line_pointer++ == ',');
2275
2276   --input_line_pointer;
2277   demand_empty_rest_of_line ();
2278 }
2279
2280 /* Handle the .rept pseudo-op.  */
2281
2282 void
2283 s_rept (ignore)
2284      int ignore;
2285 {
2286   int count;
2287   sb one;
2288   sb many;
2289
2290   count = get_absolute_expression ();
2291
2292   sb_new (&one);
2293   if (! buffer_and_nest ("REPT", "ENDR", &one, get_line_sb))
2294     {
2295       as_bad ("rept without endr");
2296       return;
2297     }
2298
2299   sb_new (&many);
2300   while (count-- > 0)
2301     sb_add_sb (&many, &one);
2302
2303   sb_kill (&one);
2304
2305   input_scrub_include_sb (&many, input_line_pointer);
2306   sb_kill (&many);
2307   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2308 }
2309
2310 void 
2311 s_set (ignore)
2312      int ignore;
2313 {
2314   register char *name;
2315   register char delim;
2316   register char *end_name;
2317   register symbolS *symbolP;
2318
2319   /*
2320    * Especial apologies for the random logic:
2321    * this just grew, and could be parsed much more simply!
2322    * Dean in haste.
2323    */
2324   name = input_line_pointer;
2325   delim = get_symbol_end ();
2326   end_name = input_line_pointer;
2327   *end_name = delim;
2328   SKIP_WHITESPACE ();
2329
2330   if (*input_line_pointer != ',')
2331     {
2332       *end_name = 0;
2333       as_bad ("Expected comma after name \"%s\"", name);
2334       *end_name = delim;
2335       ignore_rest_of_line ();
2336       return;
2337     }
2338
2339   input_line_pointer++;
2340   *end_name = 0;
2341
2342   if (name[0] == '.' && name[1] == '\0')
2343     {
2344       /* Turn '. = mumble' into a .org mumble */
2345       register segT segment;
2346       expressionS exp;
2347
2348       segment = get_known_segmented_expression (&exp);
2349
2350       if (!need_pass_2)
2351         do_org (segment, &exp, 0);
2352
2353       *end_name = delim;
2354       return;
2355     }
2356
2357   if ((symbolP = symbol_find (name)) == NULL
2358       && (symbolP = md_undefined_symbol (name)) == NULL)
2359     {
2360       symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2361 #ifdef OBJ_COFF
2362       /* "set" symbols are local unless otherwise specified. */
2363       SF_SET_LOCAL (symbolP);
2364 #endif /* OBJ_COFF */
2365
2366     }                           /* make a new symbol */
2367
2368   symbol_table_insert (symbolP);
2369
2370   *end_name = delim;
2371   pseudo_set (symbolP);
2372   demand_empty_rest_of_line ();
2373 }                               /* s_set() */
2374
2375 void 
2376 s_space (mult)
2377      int mult;
2378 {
2379   expressionS exp;
2380   long temp_fill;
2381   char *p = 0;
2382   char *stop = NULL;
2383   char stopc;
2384
2385 #ifdef md_flush_pending_output
2386   md_flush_pending_output ();
2387 #endif
2388
2389   if (flag_mri)
2390     stop = mri_comment_field (&stopc);
2391
2392   /* Just like .fill, but temp_size = 1 */
2393   expression (&exp);
2394   if (exp.X_op == O_constant)
2395     {
2396       long repeat;
2397
2398       repeat = exp.X_add_number;
2399       if (mult)
2400         repeat *= mult;
2401       if (repeat <= 0)
2402         {
2403           if (! flag_mri || repeat < 0)
2404             as_warn (".space repeat count is %s, ignored",
2405                      repeat ? "negative" : "zero");
2406           goto getout;
2407         }
2408
2409       /* If we are in the absolute section, just bump the offset.  */
2410       if (now_seg == absolute_section)
2411         {
2412           abs_section_offset += repeat;
2413           goto getout;
2414         }
2415
2416       /* If we are secretly in an MRI common section, then creating
2417          space just increases the size of the common symbol.  */
2418       if (mri_common_symbol != NULL)
2419         {
2420           S_SET_VALUE (mri_common_symbol,
2421                        S_GET_VALUE (mri_common_symbol) + repeat);
2422           goto getout;
2423         }
2424
2425       if (!need_pass_2)
2426         p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
2427                       repeat, (char *) 0);
2428     }
2429   else
2430     {
2431       if (now_seg == absolute_section)
2432         {
2433           as_bad ("space allocation too complex in absolute section");
2434           subseg_set (text_section, 0);
2435         }
2436       if (mri_common_symbol != NULL)
2437         {
2438           as_bad ("space allocation too complex in common section");
2439           mri_common_symbol = NULL;
2440         }
2441       if (!need_pass_2)
2442         p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
2443                       make_expr_symbol (&exp), 0L, (char *) 0);
2444     }
2445   SKIP_WHITESPACE ();
2446   if (*input_line_pointer == ',')
2447     {
2448       input_line_pointer++;
2449       temp_fill = get_absolute_expression ();
2450     }
2451   else
2452     {
2453       temp_fill = 0;
2454     }
2455   if (p)
2456     {
2457       *p = temp_fill;
2458     }
2459
2460  getout:
2461   if (flag_mri)
2462     mri_comment_end (stop, stopc);
2463
2464   demand_empty_rest_of_line ();
2465 }
2466
2467 /* This is like s_space, but the value is a floating point number with
2468    the given precision.  This is for the MRI dcb.s pseudo-op and
2469    friends.  */
2470
2471 void
2472 s_float_space (float_type)
2473      int float_type;
2474 {
2475   offsetT count;
2476   int flen;
2477   char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
2478   char *stop = NULL;
2479   char stopc;
2480
2481   if (flag_mri)
2482     stop = mri_comment_field (&stopc);
2483
2484   count = get_absolute_expression ();
2485
2486   SKIP_WHITESPACE ();
2487   if (*input_line_pointer != ',')
2488     {
2489       as_bad ("missing value");
2490       if (flag_mri)
2491         mri_comment_end (stop, stopc);
2492       ignore_rest_of_line ();
2493       return;
2494     }
2495
2496   ++input_line_pointer;
2497
2498   SKIP_WHITESPACE ();
2499
2500   /* Skip any 0{letter} that may be present.  Don't even check if the
2501    * letter is legal.  */
2502   if (input_line_pointer[0] == '0' && isalpha (input_line_pointer[1]))
2503     input_line_pointer += 2;
2504
2505   /* Accept :xxxx, where the x's are hex digits, for a floating point
2506      with the exact digits specified.  */
2507   if (input_line_pointer[0] == ':')
2508     {
2509       flen = hex_float (float_type, temp);
2510       if (flen < 0)
2511         {
2512           if (flag_mri)
2513             mri_comment_end (stop, stopc);
2514           ignore_rest_of_line ();
2515           return;
2516         }
2517     }
2518   else
2519     {
2520       char *err;
2521
2522       err = md_atof (float_type, temp, &flen);
2523       know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
2524       know (flen > 0);
2525       if (err)
2526         {
2527           as_bad ("Bad floating literal: %s", err);
2528           if (flag_mri)
2529             mri_comment_end (stop, stopc);
2530           ignore_rest_of_line ();
2531           return;
2532         }
2533     }
2534
2535   while (--count >= 0)
2536     {
2537       char *p;
2538
2539       p = frag_more (flen);
2540       memcpy (p, temp, (unsigned int) flen);
2541     }
2542
2543   if (flag_mri)
2544     mri_comment_end (stop, stopc);
2545
2546   demand_empty_rest_of_line ();
2547 }
2548
2549 /* Handle the .struct pseudo-op, as found in MIPS assemblers.  */
2550
2551 void
2552 s_struct (ignore)
2553      int ignore;
2554 {
2555   char *stop = NULL;
2556   char stopc;
2557
2558   if (flag_mri)
2559     stop = mri_comment_field (&stopc);
2560   abs_section_offset = get_absolute_expression ();
2561   subseg_set (absolute_section, 0);
2562   if (flag_mri)
2563     mri_comment_end (stop, stopc);
2564   demand_empty_rest_of_line ();
2565 }
2566
2567 void
2568 s_text (ignore)
2569      int ignore;
2570 {
2571   register int temp;
2572
2573   temp = get_absolute_expression ();
2574   subseg_set (text_section, (subsegT) temp);
2575   demand_empty_rest_of_line ();
2576 #ifdef OBJ_VMS
2577   const_flag &= ~IN_DEFAULT_SECTION;
2578 #endif
2579 }                               /* s_text() */
2580 \f
2581
2582 void 
2583 demand_empty_rest_of_line ()
2584 {
2585   SKIP_WHITESPACE ();
2586   if (is_end_of_line[(unsigned char) *input_line_pointer])
2587     {
2588       input_line_pointer++;
2589     }
2590   else
2591     {
2592       ignore_rest_of_line ();
2593     }
2594   /* Return having already swallowed end-of-line. */
2595 }                               /* Return pointing just after end-of-line. */
2596
2597 void
2598 ignore_rest_of_line ()          /* For suspect lines: gives warning. */
2599 {
2600   if (!is_end_of_line[(unsigned char) *input_line_pointer])
2601     {
2602       if (isprint (*input_line_pointer))
2603         as_bad ("Rest of line ignored. First ignored character is `%c'.",
2604                 *input_line_pointer);
2605       else
2606         as_bad ("Rest of line ignored. First ignored character valued 0x%x.",
2607                 *input_line_pointer);
2608       while (input_line_pointer < buffer_limit
2609              && !is_end_of_line[(unsigned char) *input_line_pointer])
2610         {
2611           input_line_pointer++;
2612         }
2613     }
2614   input_line_pointer++;         /* Return pointing just after end-of-line. */
2615   know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
2616 }
2617
2618 /*
2619  *                      pseudo_set()
2620  *
2621  * In:  Pointer to a symbol.
2622  *      Input_line_pointer->expression.
2623  *
2624  * Out: Input_line_pointer->just after any whitespace after expression.
2625  *      Tried to set symbol to value of expression.
2626  *      Will change symbols type, value, and frag;
2627  */
2628 void
2629 pseudo_set (symbolP)
2630      symbolS *symbolP;
2631 {
2632   expressionS exp;
2633 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2634   int ext;
2635 #endif /* OBJ_AOUT or OBJ_BOUT */
2636
2637   know (symbolP);               /* NULL pointer is logic error. */
2638 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2639   ext = S_IS_EXTERNAL (symbolP);
2640 #endif /* OBJ_AOUT or OBJ_BOUT */
2641
2642   (void) expression (&exp);
2643
2644   if (exp.X_op == O_illegal)
2645     as_bad ("illegal expression; zero assumed");
2646   else if (exp.X_op == O_absent)
2647     as_bad ("missing expression; zero assumed");
2648   else if (exp.X_op == O_big)
2649     as_bad ("%s number invalid; zero assumed",
2650             exp.X_add_number > 0 ? "bignum" : "floating point");
2651   else if (exp.X_op == O_subtract
2652            && (S_GET_SEGMENT (exp.X_add_symbol)
2653                == S_GET_SEGMENT (exp.X_op_symbol))
2654            && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
2655            && exp.X_add_symbol->sy_frag == exp.X_op_symbol->sy_frag)
2656     {
2657       exp.X_op = O_constant;
2658       exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
2659                           - S_GET_VALUE (exp.X_op_symbol));
2660     }
2661
2662   switch (exp.X_op)
2663     {
2664     case O_illegal:
2665     case O_absent:
2666     case O_big:
2667       exp.X_add_number = 0;
2668       /* Fall through.  */
2669     case O_constant:
2670       S_SET_SEGMENT (symbolP, absolute_section);
2671 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2672       if (ext)
2673         S_SET_EXTERNAL (symbolP);
2674       else
2675         S_CLEAR_EXTERNAL (symbolP);
2676 #endif /* OBJ_AOUT or OBJ_BOUT */
2677       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2678       symbolP->sy_frag = &zero_address_frag;
2679       break;
2680
2681     case O_register:
2682       S_SET_SEGMENT (symbolP, reg_section);
2683       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2684       symbolP->sy_frag = &zero_address_frag;
2685       break;
2686
2687     case O_symbol:
2688       if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
2689           || exp.X_add_number != 0)
2690         symbolP->sy_value = exp;
2691       else
2692         {
2693           symbolS *s = exp.X_add_symbol;
2694
2695           S_SET_SEGMENT (symbolP, S_GET_SEGMENT (s));
2696 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2697           if (ext)
2698             S_SET_EXTERNAL (symbolP);
2699           else
2700             S_CLEAR_EXTERNAL (symbolP);
2701 #endif /* OBJ_AOUT or OBJ_BOUT */
2702           S_SET_VALUE (symbolP,
2703                        exp.X_add_number + S_GET_VALUE (s));
2704           symbolP->sy_frag = s->sy_frag;
2705           copy_symbol_attributes (symbolP, s);
2706         }
2707       break;
2708
2709     default:
2710       /* The value is some complex expression.
2711          FIXME: Should we set the segment to anything?  */
2712       symbolP->sy_value = exp;
2713       break;
2714     }
2715 }
2716 \f
2717 /*
2718  *                      cons()
2719  *
2720  * CONStruct more frag of .bytes, or .words etc.
2721  * Should need_pass_2 be 1 then emit no frag(s).
2722  * This understands EXPRESSIONS.
2723  *
2724  * Bug (?)
2725  *
2726  * This has a split personality. We use expression() to read the
2727  * value. We can detect if the value won't fit in a byte or word.
2728  * But we can't detect if expression() discarded significant digits
2729  * in the case of a long. Not worth the crocks required to fix it.
2730  */
2731
2732 /* Select a parser for cons expressions.  */
2733
2734 /* Some targets need to parse the expression in various fancy ways.
2735    You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
2736    (for example, the HPPA does this).  Otherwise, you can define
2737    BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
2738    REPEAT_CONS_EXPRESSIONS to permit repeat counts.  If none of these
2739    are defined, which is the normal case, then only simple expressions
2740    are permitted.  */
2741
2742 static void
2743 parse_mri_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2744
2745 #ifndef TC_PARSE_CONS_EXPRESSION
2746 #ifdef BITFIELD_CONS_EXPRESSIONS
2747 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
2748 static void 
2749 parse_bitfield_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2750 #endif
2751 #ifdef REPEAT_CONS_EXPRESSIONS
2752 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
2753 static void
2754 parse_repeat_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2755 #endif
2756
2757 /* If we haven't gotten one yet, just call expression.  */
2758 #ifndef TC_PARSE_CONS_EXPRESSION
2759 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
2760 #endif
2761 #endif
2762
2763 /* worker to do .byte etc statements */
2764 /* clobbers input_line_pointer, checks */
2765 /* end-of-line. */
2766 static void 
2767 cons_worker (nbytes, rva)
2768      register int nbytes;       /* 1=.byte, 2=.word, 4=.long */
2769      int rva;
2770 {
2771   int c;
2772   expressionS exp;
2773   char *stop = NULL;
2774   char stopc;
2775
2776 #ifdef md_flush_pending_output
2777   md_flush_pending_output ();
2778 #endif
2779
2780   if (flag_mri)
2781     stop = mri_comment_field (&stopc);
2782
2783   if (is_it_end_of_statement ())
2784     {
2785       if (flag_mri)
2786         mri_comment_end (stop, stopc);
2787       demand_empty_rest_of_line ();
2788       return;
2789     }
2790
2791   c = 0;
2792   do
2793     {
2794       if (flag_m68k_mri)
2795         parse_mri_cons (&exp, (unsigned int) nbytes);
2796       else
2797         TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
2798
2799       if (rva)
2800         {
2801           if (exp.X_op == O_symbol)
2802             exp.X_op = O_symbol_rva;
2803           else
2804             as_fatal ("rva without symbol");
2805         }
2806       emit_expr (&exp, (unsigned int) nbytes);
2807       ++c;
2808     }
2809   while (*input_line_pointer++ == ',');
2810
2811   /* In MRI mode, after an odd number of bytes, we must align to an
2812      even word boundary, unless the next instruction is a dc.b, ds.b
2813      or dcb.b.  */
2814   if (flag_mri && nbytes == 1 && (c & 1) != 0)
2815     mri_pending_align = 1;
2816
2817   input_line_pointer--;         /* Put terminator back into stream. */
2818
2819   if (flag_mri)
2820     mri_comment_end (stop, stopc);
2821
2822   demand_empty_rest_of_line ();
2823 }
2824
2825
2826 void
2827 cons (size)
2828      int size;
2829 {
2830   cons_worker (size, 0);
2831 }
2832
2833 void 
2834 s_rva (size)
2835      int size;
2836 {
2837   cons_worker (size, 1);
2838 }
2839
2840
2841 /* Put the contents of expression EXP into the object file using
2842    NBYTES bytes.  If need_pass_2 is 1, this does nothing.  */
2843
2844 void
2845 emit_expr (exp, nbytes)
2846      expressionS *exp;
2847      unsigned int nbytes;
2848 {
2849   operatorT op;
2850   register char *p;
2851   valueT extra_digit = 0;
2852
2853   /* Don't do anything if we are going to make another pass.  */
2854   if (need_pass_2)
2855     return;
2856
2857   op = exp->X_op;
2858
2859   /* Allow `.word 0' in the absolute section.  */
2860   if (now_seg == absolute_section)
2861     {
2862       if (op != O_constant || exp->X_add_number != 0)
2863         as_bad ("attempt to store value in absolute section");
2864       abs_section_offset += nbytes;
2865       return;
2866     }
2867
2868   /* Handle a negative bignum.  */
2869   if (op == O_uminus
2870       && exp->X_add_number == 0
2871       && exp->X_add_symbol->sy_value.X_op == O_big
2872       && exp->X_add_symbol->sy_value.X_add_number > 0)
2873     {
2874       int i;
2875       unsigned long carry;
2876
2877       exp = &exp->X_add_symbol->sy_value;
2878
2879       /* Negate the bignum: one's complement each digit and add 1.  */
2880       carry = 1;
2881       for (i = 0; i < exp->X_add_number; i++)
2882         {
2883           unsigned long next;
2884
2885           next = (((~ (generic_bignum[i] & LITTLENUM_MASK))
2886                    & LITTLENUM_MASK)
2887                   + carry);
2888           generic_bignum[i] = next & LITTLENUM_MASK;
2889           carry = next >> LITTLENUM_NUMBER_OF_BITS;
2890         }
2891
2892       /* We can ignore any carry out, because it will be handled by
2893          extra_digit if it is needed.  */
2894
2895       extra_digit = (valueT) -1;
2896       op = O_big;
2897     }
2898
2899   if (op == O_absent || op == O_illegal)
2900     {
2901       as_warn ("zero assumed for missing expression");
2902       exp->X_add_number = 0;
2903       op = O_constant;
2904     }
2905   else if (op == O_big && exp->X_add_number <= 0)
2906     {
2907       as_bad ("floating point number invalid; zero assumed");
2908       exp->X_add_number = 0;
2909       op = O_constant;
2910     }
2911   else if (op == O_register)
2912     {
2913       as_warn ("register value used as expression");
2914       op = O_constant;
2915     }
2916
2917   p = frag_more ((int) nbytes);
2918
2919 #ifndef WORKING_DOT_WORD
2920   /* If we have the difference of two symbols in a word, save it on
2921      the broken_words list.  See the code in write.c.  */
2922   if (op == O_subtract && nbytes == 2)
2923     {
2924       struct broken_word *x;
2925
2926       x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
2927       x->next_broken_word = broken_words;
2928       broken_words = x;
2929       x->frag = frag_now;
2930       x->word_goes_here = p;
2931       x->dispfrag = 0;
2932       x->add = exp->X_add_symbol;
2933       x->sub = exp->X_op_symbol;
2934       x->addnum = exp->X_add_number;
2935       x->added = 0;
2936       new_broken_words++;
2937       return;
2938     }
2939 #endif
2940
2941   /* If we have an integer, but the number of bytes is too large to
2942      pass to md_number_to_chars, handle it as a bignum.  */
2943   if (op == O_constant && nbytes > sizeof (valueT))
2944     {
2945       valueT val;
2946       int gencnt;
2947
2948       if (! exp->X_unsigned && exp->X_add_number < 0)
2949         extra_digit = (valueT) -1;
2950       val = (valueT) exp->X_add_number;
2951       gencnt = 0;
2952       do
2953         {
2954           generic_bignum[gencnt] = val & LITTLENUM_MASK;
2955           val >>= LITTLENUM_NUMBER_OF_BITS;
2956           ++gencnt;
2957         }
2958       while (val != 0);
2959       op = exp->X_op = O_big;
2960       exp->X_add_number = gencnt;
2961     }
2962
2963   if (op == O_constant)
2964     {
2965       register valueT get;
2966       register valueT use;
2967       register valueT mask;
2968       register valueT unmask;
2969
2970       /* JF << of >= number of bits in the object is undefined.  In
2971          particular SPARC (Sun 4) has problems */
2972       if (nbytes >= sizeof (valueT))
2973         mask = 0;
2974       else
2975         mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes); /* Don't store these bits. */
2976
2977       unmask = ~mask;           /* Do store these bits. */
2978
2979 #ifdef NEVER
2980       "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
2981       mask = ~(unmask >> 1);    /* Includes sign bit now. */
2982 #endif
2983
2984       get = exp->X_add_number;
2985       use = get & unmask;
2986       if ((get & mask) != 0 && (get & mask) != mask)
2987         {               /* Leading bits contain both 0s & 1s. */
2988           as_warn ("Value 0x%lx truncated to 0x%lx.", get, use);
2989         }
2990       /* put bytes in right order. */
2991       md_number_to_chars (p, use, (int) nbytes);
2992     }
2993   else if (op == O_big)
2994     {
2995       int size;
2996       LITTLENUM_TYPE *nums;
2997
2998       know (nbytes % CHARS_PER_LITTLENUM == 0);
2999
3000       size = exp->X_add_number * CHARS_PER_LITTLENUM;
3001       if (nbytes < size)
3002         {
3003           as_warn ("Bignum truncated to %d bytes", nbytes);
3004           size = nbytes;
3005         }
3006
3007       if (target_big_endian)
3008         {
3009           while (nbytes > size)
3010             {
3011               md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3012               nbytes -= CHARS_PER_LITTLENUM;
3013               p += CHARS_PER_LITTLENUM;
3014             }
3015
3016           nums = generic_bignum + size / CHARS_PER_LITTLENUM;
3017           while (size > 0)
3018             {
3019               --nums;
3020               md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3021               size -= CHARS_PER_LITTLENUM;
3022               p += CHARS_PER_LITTLENUM;
3023             }
3024         }
3025       else
3026         {
3027           nums = generic_bignum;
3028           while (size > 0)
3029             {
3030               md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3031               ++nums;
3032               size -= CHARS_PER_LITTLENUM;
3033               p += CHARS_PER_LITTLENUM;
3034               nbytes -= CHARS_PER_LITTLENUM;
3035             }
3036
3037           while (nbytes > 0)
3038             {
3039               md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3040               nbytes -= CHARS_PER_LITTLENUM;
3041               p += CHARS_PER_LITTLENUM;
3042             }
3043         }
3044     }
3045   else
3046     {
3047       memset (p, 0, nbytes);
3048
3049       /* Now we need to generate a fixS to record the symbol value.
3050          This is easy for BFD.  For other targets it can be more
3051          complex.  For very complex cases (currently, the HPPA and
3052          NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3053          want.  For simpler cases, you can define TC_CONS_RELOC to be
3054          the name of the reloc code that should be stored in the fixS.
3055          If neither is defined, the code uses NO_RELOC if it is
3056          defined, and otherwise uses 0.  */
3057
3058 #ifdef BFD_ASSEMBLER
3059 #ifdef TC_CONS_FIX_NEW
3060       TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3061 #else
3062       fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3063                    /* @@ Should look at CPU word size.  */
3064                    nbytes == 2 ? BFD_RELOC_16
3065                       : nbytes == 8 ? BFD_RELOC_64
3066                       : BFD_RELOC_32);
3067 #endif
3068 #else
3069 #ifdef TC_CONS_FIX_NEW
3070       TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3071 #else
3072       /* Figure out which reloc number to use.  Use TC_CONS_RELOC if
3073          it is defined, otherwise use NO_RELOC if it is defined,
3074          otherwise use 0.  */
3075 #ifndef TC_CONS_RELOC
3076 #ifdef NO_RELOC
3077 #define TC_CONS_RELOC NO_RELOC
3078 #else
3079 #define TC_CONS_RELOC 0
3080 #endif
3081 #endif
3082       fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3083                    TC_CONS_RELOC);
3084 #endif /* TC_CONS_FIX_NEW */
3085 #endif /* BFD_ASSEMBLER */
3086     }
3087 }
3088 \f
3089 #ifdef BITFIELD_CONS_EXPRESSIONS
3090
3091 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3092    w:x,y:z, where w and y are bitwidths and x and y are values.  They
3093    then pack them all together. We do a little better in that we allow
3094    them in words, longs, etc. and we'll pack them in target byte order
3095    for you.
3096
3097    The rules are: pack least significat bit first, if a field doesn't
3098    entirely fit, put it in the next unit.  Overflowing the bitfield is
3099    explicitly *not* even a warning.  The bitwidth should be considered
3100    a "mask".
3101
3102    To use this function the tc-XXX.h file should define
3103    BITFIELD_CONS_EXPRESSIONS.  */
3104
3105 static void 
3106 parse_bitfield_cons (exp, nbytes)
3107      expressionS *exp;
3108      unsigned int nbytes;
3109 {
3110   unsigned int bits_available = BITS_PER_CHAR * nbytes;
3111   char *hold = input_line_pointer;
3112
3113   (void) expression (exp);
3114
3115   if (*input_line_pointer == ':')
3116     {                   /* bitfields */
3117       long value = 0;
3118
3119       for (;;)
3120         {
3121           unsigned long width;
3122
3123           if (*input_line_pointer != ':')
3124             {
3125               input_line_pointer = hold;
3126               break;
3127             }                   /* next piece is not a bitfield */
3128
3129           /* In the general case, we can't allow
3130              full expressions with symbol
3131              differences and such.  The relocation
3132              entries for symbols not defined in this
3133              assembly would require arbitrary field
3134              widths, positions, and masks which most
3135              of our current object formats don't
3136              support.
3137
3138              In the specific case where a symbol
3139              *is* defined in this assembly, we
3140              *could* build fixups and track it, but
3141              this could lead to confusion for the
3142              backends.  I'm lazy. I'll take any
3143              SEG_ABSOLUTE. I think that means that
3144              you can use a previous .set or
3145              .equ type symbol.  xoxorich. */
3146
3147           if (exp->X_op == O_absent)
3148             {
3149               as_warn ("using a bit field width of zero");
3150               exp->X_add_number = 0;
3151               exp->X_op = O_constant;
3152             }                   /* implied zero width bitfield */
3153
3154           if (exp->X_op != O_constant)
3155             {
3156               *input_line_pointer = '\0';
3157               as_bad ("field width \"%s\" too complex for a bitfield", hold);
3158               *input_line_pointer = ':';
3159               demand_empty_rest_of_line ();
3160               return;
3161             }                   /* too complex */
3162
3163           if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
3164             {
3165               as_warn ("field width %lu too big to fit in %d bytes: truncated to %d bits",
3166                        width, nbytes, (BITS_PER_CHAR * nbytes));
3167               width = BITS_PER_CHAR * nbytes;
3168             }                   /* too big */
3169
3170           if (width > bits_available)
3171             {
3172               /* FIXME-SOMEDAY: backing up and reparsing is wasteful.  */
3173               input_line_pointer = hold;
3174               exp->X_add_number = value;
3175               break;
3176             }                   /* won't fit */
3177
3178           hold = ++input_line_pointer; /* skip ':' */
3179
3180           (void) expression (exp);
3181           if (exp->X_op != O_constant)
3182             {
3183               char cache = *input_line_pointer;
3184
3185               *input_line_pointer = '\0';
3186               as_bad ("field value \"%s\" too complex for a bitfield", hold);
3187               *input_line_pointer = cache;
3188               demand_empty_rest_of_line ();
3189               return;
3190             }                   /* too complex */
3191
3192           value |= ((~(-1 << width) & exp->X_add_number)
3193                     << ((BITS_PER_CHAR * nbytes) - bits_available));
3194
3195           if ((bits_available -= width) == 0
3196               || is_it_end_of_statement ()
3197               || *input_line_pointer != ',')
3198             {
3199               break;
3200             }                   /* all the bitfields we're gonna get */
3201
3202           hold = ++input_line_pointer;
3203           (void) expression (exp);
3204         }                       /* forever loop */
3205
3206       exp->X_add_number = value;
3207       exp->X_op = O_constant;
3208       exp->X_unsigned = 1;
3209     }                           /* if looks like a bitfield */
3210 }                               /* parse_bitfield_cons() */
3211
3212 #endif /* BITFIELD_CONS_EXPRESSIONS */
3213 \f
3214 /* Handle an MRI style string expression.  */
3215
3216 static void
3217 parse_mri_cons (exp, nbytes)
3218      expressionS *exp;
3219      unsigned int nbytes;
3220 {
3221   if (*input_line_pointer != '\''
3222       && (input_line_pointer[1] != '\''
3223           || (*input_line_pointer != 'A'
3224               && *input_line_pointer != 'E')))
3225     TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3226   else
3227     {
3228       int scan = 0;
3229       unsigned int result = 0;
3230
3231       /* An MRI style string.  Cut into as many bytes as will fit into
3232          a nbyte chunk, left justify if necessary, and separate with
3233          commas so we can try again later.  */
3234       if (*input_line_pointer == 'A')
3235         ++input_line_pointer;
3236       else if (*input_line_pointer == 'E')
3237         {
3238           as_bad ("EBCDIC constants are not supported");
3239           ++input_line_pointer;
3240         }
3241
3242       input_line_pointer++;
3243       for (scan = 0; scan < nbytes; scan++)
3244         {
3245           if (*input_line_pointer == '\'')
3246             {
3247               if (input_line_pointer[1] == '\'')
3248                 {
3249                   input_line_pointer++;
3250                 }
3251               else
3252                 break;
3253             }
3254           result = (result << 8) | (*input_line_pointer++);
3255         }
3256
3257       /* Left justify */
3258       while (scan < nbytes)
3259         {
3260           result <<= 8;
3261           scan++;
3262         }
3263       /* Create correct expression */
3264       exp->X_op = O_constant;
3265       exp->X_add_number = result;
3266       /* Fake it so that we can read the next char too */
3267       if (input_line_pointer[0] != '\'' ||
3268           (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
3269         {
3270           input_line_pointer -= 2;
3271           input_line_pointer[0] = ',';
3272           input_line_pointer[1] = '\'';
3273         }
3274       else
3275         input_line_pointer++;
3276     }
3277 }
3278 \f
3279 #ifdef REPEAT_CONS_EXPRESSIONS
3280
3281 /* Parse a repeat expression for cons.  This is used by the MIPS
3282    assembler.  The format is NUMBER:COUNT; NUMBER appears in the
3283    object file COUNT times.
3284
3285    To use this for a target, define REPEAT_CONS_EXPRESSIONS.  */
3286
3287 static void
3288 parse_repeat_cons (exp, nbytes)
3289      expressionS *exp;
3290      unsigned int nbytes;
3291 {
3292   expressionS count;
3293   register int i;
3294
3295   expression (exp);
3296
3297   if (*input_line_pointer != ':')
3298     {
3299       /* No repeat count.  */
3300       return;
3301     }
3302
3303   ++input_line_pointer;
3304   expression (&count);
3305   if (count.X_op != O_constant
3306       || count.X_add_number <= 0)
3307     {
3308       as_warn ("Unresolvable or nonpositive repeat count; using 1");
3309       return;
3310     }
3311
3312   /* The cons function is going to output this expression once.  So we
3313      output it count - 1 times.  */
3314   for (i = count.X_add_number - 1; i > 0; i--)
3315     emit_expr (exp, nbytes);
3316 }
3317
3318 #endif /* REPEAT_CONS_EXPRESSIONS */
3319 \f
3320 /* Parse a floating point number represented as a hex constant.  This
3321    permits users to specify the exact bits they want in the floating
3322    point number.  */
3323
3324 static int
3325 hex_float (float_type, bytes)
3326      int float_type;
3327      char *bytes;
3328 {
3329   int length;
3330   int i;
3331
3332   switch (float_type)
3333     {
3334     case 'f':
3335     case 'F':
3336     case 's':
3337     case 'S':
3338       length = 4;
3339       break;
3340
3341     case 'd':
3342     case 'D':
3343     case 'r':
3344     case 'R':
3345       length = 8;
3346       break;
3347
3348     case 'x':
3349     case 'X':
3350       length = 12;
3351       break;
3352
3353     case 'p':
3354     case 'P':
3355       length = 12;
3356       break;
3357
3358     default:
3359       as_bad ("Unknown floating type type '%c'", float_type);
3360       return -1;
3361     }
3362
3363   /* It would be nice if we could go through expression to parse the
3364      hex constant, but if we get a bignum it's a pain to sort it into
3365      the buffer correctly.  */
3366   i = 0;
3367   while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
3368     {
3369       int d;
3370
3371       /* The MRI assembler accepts arbitrary underscores strewn about
3372          through the hex constant, so we ignore them as well. */
3373       if (*input_line_pointer == '_')
3374         {
3375           ++input_line_pointer;
3376           continue;
3377         }
3378
3379       if (i >= length)
3380         {
3381           as_warn ("Floating point constant too large");
3382           return -1;
3383         }
3384       d = hex_value (*input_line_pointer) << 4;
3385       ++input_line_pointer;
3386       while (*input_line_pointer == '_')
3387         ++input_line_pointer;
3388       if (hex_p (*input_line_pointer))
3389         {
3390           d += hex_value (*input_line_pointer);
3391           ++input_line_pointer;
3392         }
3393       if (target_big_endian)
3394         bytes[i] = d;
3395       else
3396         bytes[length - i - 1] = d;
3397       ++i;
3398     }
3399
3400   if (i < length)
3401     {
3402       if (target_big_endian)
3403         memset (bytes + i, 0, length - i);
3404       else
3405         memset (bytes, 0, length - i);
3406     }
3407
3408   return length;
3409 }
3410
3411 /*
3412  *                      float_cons()
3413  *
3414  * CONStruct some more frag chars of .floats .ffloats etc.
3415  * Makes 0 or more new frags.
3416  * If need_pass_2 == 1, no frags are emitted.
3417  * This understands only floating literals, not expressions. Sorry.
3418  *
3419  * A floating constant is defined by atof_generic(), except it is preceded
3420  * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
3421  * reading, I decided to be incompatible. This always tries to give you
3422  * rounded bits to the precision of the pseudo-op. Former AS did premature
3423  * truncatation, restored noisy bits instead of trailing 0s AND gave you
3424  * a choice of 2 flavours of noise according to which of 2 floating-point
3425  * scanners you directed AS to use.
3426  *
3427  * In:  input_line_pointer->whitespace before, or '0' of flonum.
3428  *
3429  */
3430
3431 void
3432 float_cons (float_type)
3433      /* Clobbers input_line-pointer, checks end-of-line. */
3434      register int float_type;   /* 'f':.ffloat ... 'F':.float ... */
3435 {
3436   register char *p;
3437   int length;                   /* Number of chars in an object. */
3438   register char *err;           /* Error from scanning floating literal. */
3439   char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
3440
3441   if (is_it_end_of_statement ())
3442     {
3443       demand_empty_rest_of_line ();
3444       return;
3445     }
3446
3447   do
3448     {
3449       /* input_line_pointer->1st char of a flonum (we hope!). */
3450       SKIP_WHITESPACE ();
3451
3452       /* Skip any 0{letter} that may be present. Don't even check if the
3453        * letter is legal. Someone may invent a "z" format and this routine
3454        * has no use for such information. Lusers beware: you get
3455        * diagnostics if your input is ill-conditioned.
3456        */
3457       if (input_line_pointer[0] == '0' && isalpha (input_line_pointer[1]))
3458         input_line_pointer += 2;
3459
3460       /* Accept :xxxx, where the x's are hex digits, for a floating
3461          point with the exact digits specified.  */
3462       if (input_line_pointer[0] == ':')
3463         {
3464           ++input_line_pointer;
3465           length = hex_float (float_type, temp);
3466           if (length < 0)
3467             {
3468               ignore_rest_of_line ();
3469               return;
3470             }
3471         }
3472       else
3473         {
3474           err = md_atof (float_type, temp, &length);
3475           know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3476           know (length > 0);
3477           if (err)
3478             {
3479               as_bad ("Bad floating literal: %s", err);
3480               ignore_rest_of_line ();
3481               return;
3482             }
3483         }
3484
3485       if (!need_pass_2)
3486         {
3487           int count;
3488
3489           count = 1;
3490
3491 #ifdef REPEAT_CONS_EXPRESSIONS
3492           if (*input_line_pointer == ':')
3493             {
3494               expressionS count_exp;
3495
3496               ++input_line_pointer;
3497               expression (&count_exp);
3498               if (count_exp.X_op != O_constant
3499                   || count_exp.X_add_number <= 0)
3500                 {
3501                   as_warn ("unresolvable or nonpositive repeat count; using 1");
3502                 }
3503               else
3504                 count = count_exp.X_add_number;
3505             }
3506 #endif
3507
3508           while (--count >= 0)
3509             {
3510               p = frag_more (length);
3511               memcpy (p, temp, (unsigned int) length);
3512             }
3513         }
3514       SKIP_WHITESPACE ();
3515     }
3516   while (*input_line_pointer++ == ',');
3517
3518   --input_line_pointer;         /* Put terminator back into stream.  */
3519   demand_empty_rest_of_line ();
3520 }                               /* float_cons() */
3521 \f
3522 /*
3523  *                      stringer()
3524  *
3525  * We read 0 or more ',' seperated, double-quoted strings.
3526  *
3527  * Caller should have checked need_pass_2 is FALSE because we don't check it.
3528  */
3529
3530
3531 void 
3532 stringer (append_zero)          /* Worker to do .ascii etc statements. */
3533      /* Checks end-of-line. */
3534      register int append_zero;  /* 0: don't append '\0', else 1 */
3535 {
3536   register unsigned int c;
3537
3538 #ifdef md_flush_pending_output
3539   md_flush_pending_output ();
3540 #endif
3541
3542   /*
3543    * The following awkward logic is to parse ZERO or more strings,
3544    * comma seperated. Recall a string expression includes spaces
3545    * before the opening '\"' and spaces after the closing '\"'.
3546    * We fake a leading ',' if there is (supposed to be)
3547    * a 1st, expression. We keep demanding expressions for each
3548    * ','.
3549    */
3550   if (is_it_end_of_statement ())
3551     {
3552       c = 0;                    /* Skip loop. */
3553       ++input_line_pointer;     /* Compensate for end of loop. */
3554     }
3555   else
3556     {
3557       c = ',';                  /* Do loop. */
3558     }
3559   while (c == ',' || c == '<' || c == '"')
3560     {
3561       SKIP_WHITESPACE ();
3562       switch (*input_line_pointer)
3563         {
3564         case '\"':
3565           ++input_line_pointer; /*->1st char of string. */
3566           while (is_a_char (c = next_char_of_string ()))
3567             {
3568               FRAG_APPEND_1_CHAR (c);
3569             }
3570           if (append_zero)
3571             {
3572               FRAG_APPEND_1_CHAR (0);
3573             }
3574           know (input_line_pointer[-1] == '\"');
3575           break;
3576         case '<':
3577           input_line_pointer++;
3578           c = get_single_number ();
3579           FRAG_APPEND_1_CHAR (c);
3580           if (*input_line_pointer != '>')
3581             {
3582               as_bad ("Expected <nn>");
3583             }
3584           input_line_pointer++;
3585           break;
3586         case ',':
3587           input_line_pointer++;
3588           break;
3589         }
3590       SKIP_WHITESPACE ();
3591       c = *input_line_pointer;
3592     }
3593
3594   demand_empty_rest_of_line ();
3595 }                               /* stringer() */
3596 \f
3597 /* FIXME-SOMEDAY: I had trouble here on characters with the
3598     high bits set.  We'll probably also have trouble with
3599     multibyte chars, wide chars, etc.  Also be careful about
3600     returning values bigger than 1 byte.  xoxorich. */
3601
3602 unsigned int 
3603 next_char_of_string ()
3604 {
3605   register unsigned int c;
3606
3607   c = *input_line_pointer++ & CHAR_MASK;
3608   switch (c)
3609     {
3610     case '\"':
3611       c = NOT_A_CHAR;
3612       break;
3613
3614 #ifndef NO_STRING_ESCAPES
3615     case '\\':
3616       switch (c = *input_line_pointer++)
3617         {
3618         case 'b':
3619           c = '\b';
3620           break;
3621
3622         case 'f':
3623           c = '\f';
3624           break;
3625
3626         case 'n':
3627           c = '\n';
3628           break;
3629
3630         case 'r':
3631           c = '\r';
3632           break;
3633
3634         case 't':
3635           c = '\t';
3636           break;
3637
3638         case 'v':
3639           c = '\013';
3640           break;
3641
3642         case '\\':
3643         case '"':
3644           break;                /* As itself. */
3645
3646         case '0':
3647         case '1':
3648         case '2':
3649         case '3':
3650         case '4':
3651         case '5':
3652         case '6':
3653         case '7':
3654         case '8':
3655         case '9':
3656           {
3657             long number;
3658             int i;
3659
3660             for (i = 0, number = 0; isdigit (c) && i < 3; c = *input_line_pointer++, i++)
3661               {
3662                 number = number * 8 + c - '0';
3663               }
3664             c = number & 0xff;
3665           }
3666           --input_line_pointer;
3667           break;
3668
3669         case 'x':
3670         case 'X':
3671           {
3672             long number;
3673
3674             number = 0;
3675             c = *input_line_pointer++;
3676             while (isxdigit (c))
3677               {
3678                 if (isdigit (c))
3679                   number = number * 16 + c - '0';
3680                 else if (isupper (c))
3681                   number = number * 16 + c - 'A' + 10;
3682                 else
3683                   number = number * 16 + c - 'a' + 10;
3684                 c = *input_line_pointer++;
3685               }
3686             c = number & 0xff;
3687             --input_line_pointer;
3688           }
3689           break;
3690
3691         case '\n':
3692           /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
3693           as_warn ("Unterminated string: Newline inserted.");
3694           c = '\n';
3695           break;
3696
3697         default:
3698
3699 #ifdef ONLY_STANDARD_ESCAPES
3700           as_bad ("Bad escaped character in string, '?' assumed");
3701           c = '?';
3702 #endif /* ONLY_STANDARD_ESCAPES */
3703
3704           break;
3705         }                       /* switch on escaped char */
3706       break;
3707 #endif /* ! defined (NO_STRING_ESCAPES) */
3708
3709     default:
3710       break;
3711     }                           /* switch on char */
3712   return (c);
3713 }                               /* next_char_of_string() */
3714 \f
3715 static segT
3716 get_segmented_expression (expP)
3717      register expressionS *expP;
3718 {
3719   register segT retval;
3720
3721   retval = expression (expP);
3722   if (expP->X_op == O_illegal
3723       || expP->X_op == O_absent
3724       || expP->X_op == O_big)
3725     {
3726       as_bad ("expected address expression; zero assumed");
3727       expP->X_op = O_constant;
3728       expP->X_add_number = 0;
3729       retval = absolute_section;
3730     }
3731   return retval;
3732 }
3733
3734 static segT 
3735 get_known_segmented_expression (expP)
3736      register expressionS *expP;
3737 {
3738   register segT retval;
3739
3740   if ((retval = get_segmented_expression (expP)) == undefined_section)
3741     {
3742       /* There is no easy way to extract the undefined symbol from the
3743          expression.  */
3744       if (expP->X_add_symbol != NULL
3745           && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
3746         as_warn ("symbol \"%s\" undefined; zero assumed",
3747                  S_GET_NAME (expP->X_add_symbol));
3748       else
3749         as_warn ("some symbol undefined; zero assumed");
3750       retval = absolute_section;
3751       expP->X_op = O_constant;
3752       expP->X_add_number = 0;
3753     }
3754   know (retval == absolute_section || SEG_NORMAL (retval));
3755   return (retval);
3756 }                               /* get_known_segmented_expression() */
3757
3758 offsetT
3759 get_absolute_expression ()
3760 {
3761   expressionS exp;
3762
3763   expression (&exp);
3764   if (exp.X_op != O_constant)
3765     {
3766       if (exp.X_op != O_absent)
3767         as_bad ("bad or irreducible absolute expression; zero assumed");
3768       exp.X_add_number = 0;
3769     }
3770   return exp.X_add_number;
3771 }
3772
3773 char                            /* return terminator */
3774 get_absolute_expression_and_terminator (val_pointer)
3775      long *val_pointer;         /* return value of expression */
3776 {
3777   /* FIXME: val_pointer should probably be offsetT *.  */
3778   *val_pointer = (long) get_absolute_expression ();
3779   return (*input_line_pointer++);
3780 }
3781 \f
3782 /*
3783  *                      demand_copy_C_string()
3784  *
3785  * Like demand_copy_string, but return NULL if the string contains any '\0's.
3786  * Give a warning if that happens.
3787  */
3788 char *
3789 demand_copy_C_string (len_pointer)
3790      int *len_pointer;
3791 {
3792   register char *s;
3793
3794   if ((s = demand_copy_string (len_pointer)) != 0)
3795     {
3796       register int len;
3797
3798       for (len = *len_pointer; len > 0; len--)
3799         {
3800           if (*s == 0)
3801             {
3802               s = 0;
3803               len = 1;
3804               *len_pointer = 0;
3805               as_bad ("This string may not contain \'\\0\'");
3806             }
3807         }
3808     }
3809   return s;
3810 }
3811 \f
3812 /*
3813  *                      demand_copy_string()
3814  *
3815  * Demand string, but return a safe (=private) copy of the string.
3816  * Return NULL if we can't read a string here.
3817  */
3818 char *
3819 demand_copy_string (lenP)
3820      int *lenP;
3821 {
3822   register unsigned int c;
3823   register int len;
3824   char *retval;
3825
3826   len = 0;
3827   SKIP_WHITESPACE ();
3828   if (*input_line_pointer == '\"')
3829     {
3830       input_line_pointer++;     /* Skip opening quote. */
3831
3832       while (is_a_char (c = next_char_of_string ()))
3833         {
3834           obstack_1grow (&notes, c);
3835           len++;
3836         }
3837       /* JF this next line is so demand_copy_C_string will return a
3838          null terminated string. */
3839       obstack_1grow (&notes, '\0');
3840       retval = obstack_finish (&notes);
3841     }
3842   else
3843     {
3844       as_warn ("Missing string");
3845       retval = NULL;
3846       ignore_rest_of_line ();
3847     }
3848   *lenP = len;
3849   return (retval);
3850 }                               /* demand_copy_string() */
3851 \f
3852 /*
3853  *              is_it_end_of_statement()
3854  *
3855  * In:  Input_line_pointer->next character.
3856  *
3857  * Do:  Skip input_line_pointer over all whitespace.
3858  *
3859  * Out: 1 if input_line_pointer->end-of-line.
3860 */
3861 int 
3862 is_it_end_of_statement ()
3863 {
3864   SKIP_WHITESPACE ();
3865   return (is_end_of_line[(unsigned char) *input_line_pointer]);
3866 }                               /* is_it_end_of_statement() */
3867
3868 void 
3869 equals (sym_name)
3870      char *sym_name;
3871 {
3872   register symbolS *symbolP;    /* symbol we are working with */
3873   char *stop;
3874   char stopc;
3875
3876   input_line_pointer++;
3877   if (*input_line_pointer == '=')
3878     input_line_pointer++;
3879
3880   while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
3881     input_line_pointer++;
3882
3883   if (flag_mri)
3884     stop = mri_comment_field (&stopc);
3885
3886   if (sym_name[0] == '.' && sym_name[1] == '\0')
3887     {
3888       /* Turn '. = mumble' into a .org mumble */
3889       register segT segment;
3890       expressionS exp;
3891
3892       segment = get_known_segmented_expression (&exp);
3893       if (!need_pass_2)
3894         do_org (segment, &exp, 0);
3895     }
3896   else
3897     {
3898       symbolP = symbol_find_or_make (sym_name);
3899       pseudo_set (symbolP);
3900     }
3901
3902   if (flag_mri)
3903     mri_comment_end (stop, stopc);
3904 }                               /* equals() */
3905
3906 /* .include -- include a file at this point. */
3907
3908 /* ARGSUSED */
3909 void 
3910 s_include (arg)
3911      int arg;
3912 {
3913   char *newbuf;
3914   char *filename;
3915   int i;
3916   FILE *try;
3917   char *path;
3918
3919   if (! flag_m68k_mri)
3920     filename = demand_copy_string (&i);
3921   else
3922     {
3923       SKIP_WHITESPACE ();
3924       i = 0;
3925       while (! is_end_of_line[(unsigned char) *input_line_pointer]
3926              && *input_line_pointer != ' '
3927              && *input_line_pointer != '\t')
3928         {
3929           obstack_1grow (&notes, *input_line_pointer);
3930           ++input_line_pointer;
3931           ++i;
3932         }
3933       obstack_1grow (&notes, '\0');
3934       filename = obstack_finish (&notes);
3935       while (! is_end_of_line[(unsigned char) *input_line_pointer])
3936         ++input_line_pointer;
3937     }
3938   demand_empty_rest_of_line ();
3939   path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
3940   for (i = 0; i < include_dir_count; i++)
3941     {
3942       strcpy (path, include_dirs[i]);
3943       strcat (path, "/");
3944       strcat (path, filename);
3945       if (0 != (try = fopen (path, "r")))
3946         {
3947           fclose (try);
3948           goto gotit;
3949         }
3950     }
3951   free (path);
3952   path = filename;
3953 gotit:
3954   /* malloc Storage leak when file is found on path.  FIXME-SOMEDAY. */
3955   newbuf = input_scrub_include_file (path, input_line_pointer);
3956   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3957 }                               /* s_include() */
3958
3959 void 
3960 add_include_dir (path)
3961      char *path;
3962 {
3963   int i;
3964
3965   if (include_dir_count == 0)
3966     {
3967       include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
3968       include_dirs[0] = ".";    /* Current dir */
3969       include_dir_count = 2;
3970     }
3971   else
3972     {
3973       include_dir_count++;
3974       include_dirs = (char **) realloc (include_dirs,
3975                                 include_dir_count * sizeof (*include_dirs));
3976     }
3977
3978   include_dirs[include_dir_count - 1] = path;   /* New one */
3979
3980   i = strlen (path);
3981   if (i > include_dir_maxlen)
3982     include_dir_maxlen = i;
3983 }                               /* add_include_dir() */
3984
3985 void 
3986 s_ignore (arg)
3987      int arg;
3988 {
3989   while (!is_end_of_line[(unsigned char) *input_line_pointer])
3990     {
3991       ++input_line_pointer;
3992     }
3993   ++input_line_pointer;
3994 }
3995
3996
3997 void
3998 read_print_statistics (file)
3999      FILE *file;
4000 {
4001   hash_print_statistics (file, "pseudo-op table", po_hash);
4002 }
4003
4004 /* end of read.c */