defun.c revision 1.1.1.1
1/* defun.c -- @defun and friends. 2 $Id: defun.c,v 1.1.1.1 2000/02/09 01:25:10 espie Exp $ 3 4 Copyright (C) 1998, 99 Free Software Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software Foundation, 18 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 19 20#include "system.h" 21#include "defun.h" 22#include "insertion.h" 23#include "makeinfo.h" 24 25 26#define DEFUN_SELF_DELIMITING(c) \ 27 ((c) == '(' || (c) == ')' || (c) == '[' || (c) == ']') 28 29struct token_accumulator 30{ 31 unsigned int length; 32 unsigned int index; 33 char **tokens; 34}; 35 36static void 37initialize_token_accumulator (accumulator) 38 struct token_accumulator *accumulator; 39{ 40 accumulator->length = 0; 41 accumulator->index = 0; 42 accumulator->tokens = NULL; 43} 44 45static void 46accumulate_token (accumulator, token) 47 struct token_accumulator *accumulator; 48 char *token; 49{ 50 if (accumulator->index >= accumulator->length) 51 { 52 accumulator->length += 10; 53 accumulator->tokens = xrealloc (accumulator->tokens, 54 (accumulator->length * sizeof (char *))); 55 } 56 accumulator->tokens[accumulator->index] = token; 57 accumulator->index += 1; 58} 59 60/* Given STRING_POINTER pointing at an open brace, skip forward and return a 61 pointer to just past the matching close brace. */ 62static int 63scan_group_in_string (string_pointer) 64 char **string_pointer; 65{ 66 char *scan_string = (*string_pointer) + 1; 67 unsigned int level = 1; 68 69 for (;;) 70 { 71 int c; 72 if (level == 0) 73 { 74 *string_pointer = scan_string; 75 return 1; 76 } 77 c = *scan_string++; 78 if (c == 0) 79 { 80 /* Tweak line_number to compensate for fact that 81 we gobbled the whole line before coming here. */ 82 line_number -= 1; 83 line_error (_("Missing `}' in @def arg")); 84 line_number += 1; 85 *string_pointer = scan_string - 1; 86 return 0; 87 } 88 89 if (c == '{') 90 level += 1; 91 if (c == '}') 92 level -= 1; 93 } 94} 95 96/* Return a list of tokens from the contents of STRING. 97 Commands and brace-delimited groups count as single tokens. 98 Contiguous whitespace characters are converted to a token 99 consisting of a single space. */ 100static char ** 101args_from_string (string) 102 char *string; 103{ 104 struct token_accumulator accumulator; 105 char *token_start, *token_end; 106 char *scan_string = string; 107 108 initialize_token_accumulator (&accumulator); 109 110 while (*scan_string) 111 { /* Replace arbitrary whitespace by a single space. */ 112 if (whitespace (*scan_string)) 113 { 114 scan_string += 1; 115 while (whitespace (*scan_string)) 116 scan_string += 1; 117 accumulate_token ((&accumulator), (xstrdup (" "))); 118 continue; 119 } 120 121 /* Commands count as single tokens. */ 122 if (*scan_string == COMMAND_PREFIX) 123 { 124 token_start = scan_string; 125 scan_string += 1; 126 if (self_delimiting (*scan_string)) 127 scan_string += 1; 128 else 129 { 130 int c; 131 while (1) 132 { 133 c = *scan_string++; 134 135 if ((c == 0) || (c == '{') || (whitespace (c))) 136 { 137 scan_string -= 1; 138 break; 139 } 140 } 141 142 if (*scan_string == '{') 143 { 144 char *s = scan_string; 145 (void) scan_group_in_string (&s); 146 scan_string = s; 147 } 148 } 149 token_end = scan_string; 150 } 151 152 /* Parentheses and brackets are self-delimiting. */ 153 else if (DEFUN_SELF_DELIMITING (*scan_string)) 154 { 155 token_start = scan_string; 156 scan_string += 1; 157 token_end = scan_string; 158 } 159 160 /* Open brace introduces a group that is a single token. */ 161 else if (*scan_string == '{') 162 { 163 char *s = scan_string; 164 int balanced = scan_group_in_string (&s); 165 166 token_start = scan_string + 1; 167 scan_string = s; 168 token_end = balanced ? (scan_string - 1) : scan_string; 169 } 170 171 /* Otherwise a token is delimited by whitespace, parentheses, 172 brackets, or braces. A token is also ended by a command. */ 173 else 174 { 175 token_start = scan_string; 176 177 for (;;) 178 { 179 int c; 180 181 c = *scan_string++; 182 183 /* Do not back up if we're looking at a }; since the only 184 valid }'s are those matched with {'s, we want to give 185 an error. If we back up, we go into an infinite loop. */ 186 if (!c || whitespace (c) || DEFUN_SELF_DELIMITING (c) 187 || c == '{') 188 { 189 scan_string--; 190 break; 191 } 192 193 /* If we encounter a command embedded within a token, 194 then end the token. */ 195 if (c == COMMAND_PREFIX) 196 { 197 scan_string--; 198 break; 199 } 200 } 201 token_end = scan_string; 202 } 203 204 accumulate_token (&accumulator, substring (token_start, token_end)); 205 } 206 accumulate_token (&accumulator, NULL); 207 return accumulator.tokens; 208} 209 210static void 211process_defun_args (defun_args, auto_var_p) 212 char **defun_args; 213 int auto_var_p; 214{ 215 int pending_space = 0; 216 217 for (;;) 218 { 219 char *defun_arg = *defun_args++; 220 221 if (defun_arg == NULL) 222 break; 223 224 if (defun_arg[0] == ' ') 225 { 226 pending_space = 1; 227 continue; 228 } 229 230 if (pending_space) 231 { 232 add_char (' '); 233 pending_space = 0; 234 } 235 236 if (DEFUN_SELF_DELIMITING (defun_arg[0])) 237 add_char (defun_arg[0]); 238 else if (defun_arg[0] == '&') 239 if (html) 240 { 241 defun_arg = escape_string (xstrdup (defun_arg)); 242 add_word (defun_arg); 243 free (defun_arg); 244 } 245 else 246 add_word (defun_arg); 247 else if (defun_arg[0] == COMMAND_PREFIX) 248 execute_string ("%s", defun_arg); 249 else if (auto_var_p) 250 if (html) 251 { 252 defun_arg = escape_string (xstrdup (defun_arg)); 253 add_word (defun_arg); 254 free (defun_arg); 255 } 256 else 257 add_word (defun_arg); 258 else 259 add_word (defun_arg); 260 } 261} 262 263static char * 264next_nonwhite_defun_arg (arg_pointer) 265 char ***arg_pointer; 266{ 267 char **scan = (*arg_pointer); 268 char *arg = (*scan++); 269 270 if ((arg != 0) && (*arg == ' ')) 271 arg = *scan++; 272 273 if (arg == 0) 274 scan -= 1; 275 276 *arg_pointer = scan; 277 278 return (arg == 0) ? "" : arg; 279} 280 281 282/* This is needed also in insertion.c. */ 283 284enum insertion_type 285get_base_type (type) 286 enum insertion_type type; 287{ 288 enum insertion_type base_type; 289 switch (type) 290 { 291 case defivar: base_type = defcv; break; 292 case defmac: base_type = deffn; break; 293 case defmethod: base_type = defop; break; 294 case defopt: base_type = defvr; break; 295 case defspec: base_type = deffn; break; 296 case deftypefun: base_type = deftypefn; break; 297 case deftypeivar: base_type = deftypeivar; break; 298 case deftypemethod: base_type = deftypemethod; break; 299 case deftypeop: base_type = deftypeop; break; 300 case deftypevar: base_type = deftypevr; break; 301 case defun: base_type = deffn; break; 302 case defvar: base_type = defvr; break; 303 default: 304 base_type = type; 305 break; 306 } 307 308 return base_type; 309} 310 311/* Make the defun type insertion. 312 TYPE says which insertion this is. 313 X_P, if nonzero, says not to start a new insertion. */ 314static void 315defun_internal (type, x_p) 316 enum insertion_type type; 317 int x_p; 318{ 319 enum insertion_type base_type; 320 char **defun_args, **scan_args; 321 char *category, *defined_name, *type_name, *type_name2; 322 323 { 324 char *line; 325 326 /* The @def.. line is the only place in Texinfo where you are 327 allowed to use unquoted braces that don't delimit arguments of 328 a command or a macro; in any other place it will trigger an 329 error message from the reader loop. The special handling of 330 this case inside `args_from_string' is an extra special hack 331 which allows this. The side effect is that if we try to expand 332 the rest of the line below, the recursive reader loop will 333 signal an error if there are brace-delimited arguments on that line. 334 335 The best solution to this would be to change the syntax of 336 @def.. commands so that it doesn't violate Texinfo's own rules. 337 But it's probably too late for this now, as it will break a lot 338 of existing manuals. 339 340 Unfortunately, this means that you can't call macros, use @value, etc. 341 inside @def.. commands, sigh. */ 342 get_rest_of_line (0, &line); 343 defun_args = (args_from_string (line)); 344 free (line); 345 } 346 347 scan_args = defun_args; 348 349 /* Get base type and category string. */ 350 base_type = get_base_type (type); 351 352 /* xx all these const strings should be determined upon 353 documentlanguage argument and NOT via gettext (kama). */ 354 switch (type) 355 { 356 case defun: 357 case deftypefun: 358 category = _("Function"); 359 break; 360 case defmac: 361 category = _("Macro"); 362 break; 363 case defspec: 364 category = _("Special Form"); 365 break; 366 case defvar: 367 case deftypevar: 368 category = _("Variable"); 369 break; 370 case defopt: 371 category = _("User Option"); 372 break; 373 case defivar: 374 case deftypeivar: 375 category = _("Instance Variable"); 376 break; 377 case defmethod: 378 case deftypemethod: 379 category = _("Method"); 380 break; 381 default: 382 category = next_nonwhite_defun_arg (&scan_args); 383 break; 384 } 385 386 /* The class name. */ 387 if ((base_type == deftypefn) 388 || (base_type == deftypevr) 389 || (base_type == defcv) 390 || (base_type == defop) 391 || (base_type == deftypeivar) 392 || (base_type == deftypemethod) 393 || (base_type == deftypeop) 394 ) 395 type_name = next_nonwhite_defun_arg (&scan_args); 396 397 /* The type name for typed languages. */ 398 if (base_type == deftypemethod 399 || base_type == deftypeivar 400 || base_type == deftypeop 401 ) 402 type_name2 = next_nonwhite_defun_arg (&scan_args); 403 404 /* The function or whatever that's actually being defined. */ 405 defined_name = next_nonwhite_defun_arg (&scan_args); 406 407 /* This hack exists solely for the purposes of formatting the Texinfo 408 manual. I couldn't think of a better way. The token might be a 409 simple @@ followed immediately by more text. If this is the case, 410 then the next defun arg is part of this one, and we should 411 concatenate them. */ 412 if (*scan_args && **scan_args && !whitespace (**scan_args) 413 && STREQ (defined_name, "@@")) 414 { 415 char *tem = xmalloc (3 + strlen (scan_args[0])); 416 417 sprintf (tem, "@@%s", scan_args[0]); 418 419 free (scan_args[0]); 420 scan_args[0] = tem; 421 scan_args++; 422 defined_name = tem; 423 } 424 425 if (!x_p) 426 begin_insertion (type); 427 428 /* Write the definition header line. 429 This should start at the normal indentation. */ 430 current_indent -= default_indentation_increment; 431 start_paragraph (); 432 433 if (html && !x_p) 434 /* Start the definition on new paragraph. */ 435 add_word ("<p>\n"); 436 437 if (!html) 438 switch (base_type) 439 { 440 case deffn: 441 case defvr: 442 case deftp: 443 execute_string (" -- %s: %s", category, defined_name); 444 break; 445 case deftypefn: 446 case deftypevr: 447 execute_string (" -- %s: %s %s", category, type_name, defined_name); 448 break; 449 case defcv: 450 execute_string (" -- %s %s %s: %s", category, _("of"), type_name, 451 defined_name); 452 break; 453 case deftypeivar: 454 execute_string (" -- %s %s %s: %s %s", category, _("of"), type_name, 455 type_name2, defined_name); 456 break; 457 case defop: 458 execute_string (" -- %s %s %s: %s", category, _("on"), type_name, 459 defined_name); 460 break; 461 case deftypeop: 462 execute_string (" -- %s %s %s: %s %s", category, _("on"), type_name, 463 type_name2, defined_name); 464 break; 465 case deftypemethod: 466 execute_string (" -- %s %s %s: %s %s", category, _("on"), type_name, 467 type_name2, defined_name); 468 break; 469 } 470 471 if (html) 472 { 473 /* If this is not a @def...x version, it could only 474 be a normal version @def.... So start the table here. */ 475 if (!x_p) 476 add_word ("<table width=\"100%\">\n"); 477 478 /* If this is an @def...x there has to be an other @def... before 479 it, so this is only a new row within an existing table. With 480 two complete standalone tables the gap between them is too big. */ 481 add_word ("<tr>\n"); 482 add_word ("<td align=\"left\">"); 483 484 switch (base_type) 485 { 486 case deffn: 487 case defvr: 488 case deftp: 489 /* <i> is for the following function arguments. */ 490 add_word_args ("<b>%s</b><i>", defined_name); 491 break; 492 case deftypefn: 493 case deftypevr: 494 add_word_args ("%s <b>%s</b><i>", type_name, defined_name); 495 break; 496 case defcv: 497 case defop: 498 add_word_args ("<b>%s</b><i>", defined_name); 499 break; 500 case deftypemethod: 501 case deftypeop: 502 case deftypeivar: 503 add_word_args ("%s <b>%s</b><i>", type_name2, defined_name); 504 break; 505 } 506 } /* if (html)... */ 507 508 current_indent += default_indentation_increment; 509 510 /* Now process the function arguments, if any. If these carry onto 511 the next line, they should be indented by two increments to 512 distinguish them from the body of the definition, which is indented 513 by one increment. */ 514 current_indent += default_indentation_increment; 515 516 switch (base_type) 517 { 518 case deffn: 519 case defop: 520 process_defun_args (scan_args, 1); 521 break; 522 523 /* Through Makeinfo 1.67 we processed remaining args only for deftp, 524 deftypefn, and deftypemethod. But the libc manual, for example, 525 needs to say: 526 @deftypevar {char *} tzname[2] 527 And simply allowing the extra text seems far simpler than trying 528 to invent yet more defn commands. In any case, we should either 529 output it or give an error, not silently ignore it. */ 530 default: 531 process_defun_args (scan_args, 0); 532 break; 533 } 534 535 current_indent -= default_indentation_increment; 536 close_single_paragraph (); 537 538 if (html) 539 { 540 /* xx The single words (on, off) used here, should depend on 541 documentlanguage and NOT on gettext --kama. */ 542 switch (base_type) 543 { 544 case deffn: 545 case defvr: 546 case deftp: 547 case deftypefn: 548 case deftypevr: 549 add_word ("</i>"); /* close italic area for arguments */ 550 /* put the rest into the second column */ 551 add_word_args ("</td>\n<td align=\"right\">%s", category); 552 break; 553 554 case defcv: 555 add_word ("</td>\n<td align=\"right\">"); 556 add_word_args ("%s %s %s", category, _("of"), type_name); 557 break; 558 559 case defop: 560 case deftypemethod: 561 case deftypeop: 562 add_word ("</i>"); 563 add_word ("</td>\n<td align=\"right\">"); 564 add_word_args ("%s %s %s", category, _("on"), type_name); 565 break; 566 567 case deftypeivar: 568 add_word ("</i>"); 569 add_word ("</td>\n<td align=\"right\">"); 570 add_word_args ("%s %s %s", category, _("of"), type_name); 571 break; 572 } /* switch (base_type)... */ 573 574 add_word ("</td>\n"); /* close second column */ 575 add_word ("</tr>\n"); /* close row */ 576 577 /* This is needed because I have to know if the next line is 578 normal text or another @def..x. If text follows, create a new 579 table to get the indentation for the following text. 580 581 This construction would fail if someone uses: 582 @deffn 583 @sp 2 584 @deffnx 585 . 586 @end deffn 587 But we don't care. */ 588 if (!looking_at ("@def")) 589 { 590 add_word ("</table>\n"); 591 add_word ("<table width=\"95%\" align=\"center\">\n"); 592 add_word ("<tr><td>\n"); 593 } 594 595 } /* if (html)... */ 596 597 /* Make an entry in the appropriate index. */ 598 switch (base_type) 599 { 600 case deffn: 601 case deftypefn: 602 execute_string ("@findex %s\n", defined_name); 603 break; 604 case defvr: 605 case deftypevr: 606 case defcv: 607 execute_string ("@vindex %s\n", defined_name); 608 break; 609 case deftypeivar: 610 execute_string ("@vindex %s %s %s\n", defined_name, _("of"), type_name); 611 break; 612 case defop: 613 case deftypeop: 614 case deftypemethod: 615 execute_string ("@findex %s %s %s\n", defined_name, _("on"), type_name); 616 break; 617 case deftp: 618 execute_string ("@tindex %s\n", defined_name); 619 break; 620 } 621 622 /* Deallocate the token list. */ 623 scan_args = defun_args; 624 while (1) 625 { 626 char * arg = (*scan_args++); 627 if (arg == NULL) 628 break; 629 free (arg); 630 } 631 free (defun_args); 632} 633 634/* Add an entry for a function, macro, special form, variable, or option. 635 If the name of the calling command ends in `x', then this is an extra 636 entry included in the body of an insertion of the same type. */ 637void 638cm_defun () 639{ 640 int x_p; 641 enum insertion_type type; 642 char *temp = xstrdup (command); 643 644 x_p = (command[strlen (command) - 1] == 'x'); 645 646 if (x_p) 647 temp[strlen (temp) - 1] = 0; 648 649 type = find_type_from_name (temp); 650 free (temp); 651 652 /* If we are adding to an already existing insertion, then make sure 653 that we are already in an insertion of type TYPE. */ 654 if (x_p && (!insertion_level || insertion_stack->insertion != type)) 655 { 656 line_error (_("Must be in `%s' insertion to use `%sx'"), 657 command, command); 658 discard_until ("\n"); 659 return; 660 } 661 662 defun_internal (type, x_p); 663} 664