conversion.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* This file contains functions to handle %d, %$, %dist constructs in the
  2. * as_table.
  3. */
  4. pr_text_with_conversions( str)
  5. char *str;
  6. {
  7. char *ptr, *next_conversion(), *pr_conversion();
  8. while ( ptr = next_conversion( str)) {
  9. /* ptr points to '%'-sign */
  10. *ptr = '\0';
  11. out( "fprint( outfile, \"");
  12. out_string( str);
  13. out( "\");");
  14. *ptr = '%';
  15. str = pr_conversion( ptr);
  16. }
  17. out( "fprint( outfile, \"");
  18. out_string( str);
  19. out( "\");");
  20. }
  21. out_string( s)
  22. char *s;
  23. {
  24. for ( ; *s != '\0'; s++)
  25. switch ( *s) {
  26. case '"' : out( "\\\"");
  27. break;
  28. case '\\': out( "\\\\");
  29. break;
  30. case '\n': out( "\\n");
  31. break;
  32. default : out( "%c", *s);
  33. }
  34. }
  35. char *next_conversion( str)
  36. char *str;
  37. /* Look for a %-sign, but not in a comment or string! */
  38. {
  39. char *match();
  40. while ( *str && *str != '%') {
  41. switch ( *str++) {
  42. case '\'' : str = match( '\'', str) + 1;
  43. break;
  44. case '"' : str = match( '"', str) + 1;
  45. break;
  46. }
  47. }
  48. return( *str == '%' ? str : (char *)0);
  49. }
  50. char *match( c, str)
  51. char c, *str;
  52. /* Look for charcter 'c', but watch out for things like \n */
  53. {
  54. while ( *str && ( *str != c || *(str-1) == '\\'))
  55. str++;
  56. return( *str ? str : str-1);
  57. }
  58. char *match_bracket( str)
  59. char *str;
  60. /* find ')', but look at nesting '('-')' pairs, return position of ')'.
  61. * Skip strings and comments.
  62. */
  63. {
  64. int depth;
  65. char *match();
  66. depth = 1;
  67. while ( *str && depth != 0) {
  68. switch ( *str++) {
  69. case '\'' : str = match( '\'', str+1) + 1;
  70. break;
  71. case '"' : str = match( '"', str+1) + 1;
  72. break;
  73. case '(' : depth++;
  74. break;
  75. case ')' : depth--;
  76. break;
  77. }
  78. }
  79. return( str-1);
  80. }
  81. char *find( c, str)
  82. char c, *str;
  83. {
  84. while ( *str && *str != c)
  85. str++;
  86. return( str);
  87. }
  88. char *pr_conversion( str)
  89. char *str;
  90. /* str points to '%'-sign, returns pointer to first character AFTER the
  91. * conversion. %$ will result in a call of eval(), %d will call dist().
  92. */
  93. {
  94. char *start, *ptr, *match_bracket(), *find();
  95. start = find( '(', str+1);
  96. *start++ = '\0';
  97. ptr = match_bracket( start);
  98. *ptr = '\0';
  99. if ( *(str+1) == '$')
  100. out( "eval( %s);", start);
  101. else if ( strncmp( str+1, "dist", 4) == 0)
  102. out( "dist( %s);", start);
  103. else
  104. out( "fprint( outfile, \"%%%s\", %s);", str+1, start);
  105. return( ptr+1);
  106. }