about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--002test.cc1
-rw-r--r--031address.cc4
-rw-r--r--041name.cc14
-rw-r--r--043space.cc15
-rw-r--r--044space_surround.cc10
-rw-r--r--050scenario.cc26
-rw-r--r--060string.mu79
7 files changed, 128 insertions, 21 deletions
diff --git a/002test.cc b/002test.cc
index 76bf02cf..ea75db82 100644
--- a/002test.cc
+++ b/002test.cc
@@ -88,6 +88,7 @@ long long int to_integer(string n) {
   char* end = NULL;
   // safe because string.c_str() is guaranteed to be null-terminated
   long long int result = strtoll(n.c_str(), &end, /*any base*/0);
+  if (*end != '\0') raise << "tried to convert " << n << " to number\n";
   assert(*end == '\0');
   return result;
 }
diff --git a/031address.cc b/031address.cc
index cee1d0e8..052eec37 100644
--- a/031address.cc
+++ b/031address.cc
@@ -102,14 +102,14 @@ base = canonize(base);
 
 :(code)
 bool has_property(reagent x, string name) {
-  for (long long int i = 0; i < SIZE(x.properties); ++i) {
+  for (long long int i = /*skip name:type*/1; i < SIZE(x.properties); ++i) {
     if (x.properties.at(i).first == name) return true;
   }
   return false;
 }
 
 vector<string> property(const reagent& r, const string& name) {
-  for (long long int p = 0; p != SIZE(r.properties); ++p) {
+  for (long long int p = /*skip name:type*/1; p != SIZE(r.properties); ++p) {
     if (r.properties.at(p).first == name)
       return r.properties.at(p).second;
   }
diff --git a/041name.cc b/041name.cc
index 0b9e2270..300a9c60 100644
--- a/041name.cc
+++ b/041name.cc
@@ -70,8 +70,7 @@ bool disqualified(/*mutable*/ reagent& x) {
   if (is_raw(x)) return true;
   if (isa_literal(x)) return true;
   if (is_integer(x.name)) return true;
-  if (x.name == "default-space")
-    x.initialized = true;
+  // End Disqualified Reagents
   if (x.initialized) return true;
   return false;
 }
@@ -125,12 +124,11 @@ bool is_raw(const reagent& r) {
 
 bool is_special_name(const string& s) {
   if (s == "_") return true;
-  // lexical scopes
-  if (s == "default-space") return true;
   if (s == "0") return true;
   // tests will use these in later layers even though tests will mostly use numeric addresses
   if (s == "screen") return true;
   if (s == "keyboard") return true;
+  // End is_special_name Cases
   return false;
 }
 
@@ -142,14 +140,6 @@ recipe main [
 +name: assign x 1
 -name: assign _ 1
 
-//: one reserved word that we'll need later
-:(scenario convert_names_passes_default_space)
-recipe main [
-  default-space:number, x:number <- copy 0:literal, 1:literal
-]
-+name: assign x 1
--name: assign default-space 1
-
 //: an escape hatch to suppress name conversion that we'll use later
 :(scenario convert_names_passes_raw)
 recipe main [
diff --git a/043space.cc b/043space.cc
index 37683ab8..e1100f89 100644
--- a/043space.cc
+++ b/043space.cc
@@ -25,6 +25,21 @@ recipe main [
 ]
 +mem: storing 34 in location 8
 
+//:: first disable name conversion for 'default-space'
+:(scenario convert_names_passes_default_space)
+recipe main [
+  default-space:number, x:number <- copy 0:literal, 1:literal
+]
++name: assign x 1
+-name: assign default-space 1
+
+:(before "End Disqualified Reagents")
+if (x.name == "default-space")
+  x.initialized = true;
+:(before "End is_special_name Cases")
+if (s == "default-space") return true;
+
+//:: now implement space support
 :(before "End call Fields")
 long long int default_space;
 :(replace "call(recipe_number r) :running_recipe(r)")
diff --git a/044space_surround.cc b/044space_surround.cc
index 54c92973..61521013 100644
--- a/044space_surround.cc
+++ b/044space_surround.cc
@@ -27,11 +27,13 @@ recipe main [
 
 :(replace{} "long long int space_base(const reagent& x)")
 long long int space_base(const reagent& x) {
+//?   cerr << "space_base: " << x.to_string() << '\n'; //? 1
   return space_base(x, space_index(x), Current_routine->calls.front().default_space);
 }
 
 long long int space_base(const reagent& x, long long int space_index, long long int base) {
 //?   trace("foo") << "base of space " << space_index << '\n'; //? 1
+//?   cerr << "space_base sub: " << x.to_string() << '\n'; //? 1
   if (space_index == 0) {
 //?     trace("foo") << "base of space " << space_index << " is " << base << '\n'; //? 1
     return base;
@@ -42,7 +44,8 @@ long long int space_base(const reagent& x, long long int space_index, long long
 }
 
 long long int space_index(const reagent& x) {
-  for (long long int i = 0; i < SIZE(x.properties); ++i) {
+//?   cerr << "space_index: " << x.to_string() << '\n'; //? 1
+  for (long long int i = /*skip name:type*/1; i < SIZE(x.properties); ++i) {
     if (x.properties.at(i).first == "space") {
       assert(SIZE(x.properties.at(i).second) == 1);
       return to_integer(x.properties.at(i).second.at(0));
@@ -50,3 +53,8 @@ long long int space_index(const reagent& x) {
   }
   return 0;
 }
+
+:(scenario permit_space_as_variable_name)
+recipe main [
+  space:number <- copy 0:literal
+]
diff --git a/050scenario.cc b/050scenario.cc
index 1d7366cd..8df08e77 100644
--- a/050scenario.cc
+++ b/050scenario.cc
@@ -252,13 +252,31 @@ void check_type(const string& lhs, istream& in) {
 
 void check_string(long long int address, const string& literal) {
   trace(Primitive_recipe_depth, "run") << "checking string length at " << address;
-  if (Memory[address] != SIZE(literal))
-    raise << "expected location " << address << " to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << Memory[address] << '\n';
+  if (Memory[address] != SIZE(literal)) {
+    if (Current_scenario && !Hide_warnings)
+      raise << "\nF - " << Current_scenario->name << ": expected location " << address << " to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << Memory[address] << '\n';
+    else
+      raise << "expected location " << address << " to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << Memory[address] << '\n';
+    if (!Hide_warnings) {
+      Passed = false;
+      ++Num_failures;
+    }
+    return;
+  }
   ++address;  // now skip length
   for (long long int i = 0; i < SIZE(literal); ++i) {
     trace(Primitive_recipe_depth, "run") << "checking location " << address+i;
-    if (Memory[address+i] != literal.at(i))
-      raise << "expected location " << (address+i) << " to contain " << literal.at(i) << " but saw " << Memory[address+i] << '\n';
+    if (Memory[address+i] != literal.at(i)) {
+      if (Current_scenario && !Hide_warnings)
+        raise << "\nF - " << Current_scenario->name << ": expected location " << (address+i) << " to contain " << literal.at(i) << " but saw " << Memory[address+i] << '\n';
+      else
+        raise << "expected location " << (address+i) << " to contain " << literal.at(i) << " but saw " << Memory[address+i] << '\n';
+      if (!Hide_warnings) {
+        Passed = false;
+        ++Num_failures;
+      }
+      return;
+    }
   }
 }
 
diff --git a/060string.mu b/060string.mu
index f0b3ad18..338748fc 100644
--- a/060string.mu
+++ b/060string.mu
@@ -494,6 +494,69 @@ scenario interpolate-at-end [
   ]
 ]
 
+recipe space? [
+  default-space:array:address:location <- new location:type, 30:literal
+  c:character <- next-ingredient
+  result:boolean <- equal c:character, 32:literal/space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 10:literal/newline
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 9:literal/tab
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 13:literal/carriage-return
+  # remaining uncommon cases in sorted order
+  # http://unicode.org code-points in unicode-set Z and Pattern_White_Space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 11:literal/ctrl-k
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 12:literal/ctrl-l
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 133:literal/ctrl-0085
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 160:literal/no-break-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 5760:literal/ogham-space-mark
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8192:literal/en-quad
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8193:literal/em-quad
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8194:literal/en-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8195:literal/em-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8196:literal/three-per-em-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8197:literal/four-per-em-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8198:literal/six-per-em-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8199:literal/figure-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8200:literal/punctuation-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8201:literal/thin-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8202:literal/hair-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8206:literal/left-to-right
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8207:literal/right-to-left
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8232:literal/line-separator
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8233:literal/paragraph-separator
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8239:literal/narrow-no-break-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 8287:literal/medium-mathematical-space
+  jump-if result:boolean, +reply:label
+  result:boolean <- equal c:character, 12288:literal/ideographic-space
+  jump-if result:boolean, +reply:label
+  +reply
+  reply result:boolean
+]
+
 recipe trim [
   default-space:array:address:location <- new location:type, 30:literal
   s:address:array:character <- next-ingredient
@@ -508,7 +571,7 @@ recipe trim [
       reply result:address:array:character
     }
     curr:character <- index s:address:array:character/deref, start:number
-    whitespace?:boolean <- equal curr:character, 32:literal/space
+    whitespace?:boolean <- space? curr:character
     break-unless whitespace?:boolean
     start:number <- add start:number, 1:literal
     loop
@@ -519,7 +582,7 @@ recipe trim [
     not-at-start?:boolean <- greater-than end:number, start:number
     assert not-at-start?:boolean [end ran up against start]
     curr:character <- index s:address:array:character/deref, end:number
-    whitespace?:boolean <- equal curr:character, 32:literal/space
+    whitespace?:boolean <- space? curr:character
     break-unless whitespace?:boolean
     end:number <- subtract end:number, 1:literal
     loop
@@ -589,3 +652,15 @@ scenario trim-left-right [
     3:string <- [abc]
   ]
 ]
+
+scenario trim-newline-tab [
+  run [
+    1:address:array:character <- new [	abc
+]
+    2:address:array:character <- trim 1:address:array:character
+    3:array:character <- copy 2:address:array:character/deref
+  ]
+  memory-should-contain [
+    3:string <- [abc]
+  ]
+]
ref='#n719'>719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974