texlive[74579] Build/source/texk/web2c/mplibdir: MetaPost: fixed

commits+lscarso at tug.org commits+lscarso at tug.org
Tue Mar 11 23:12:37 CET 2025


Revision: 74579
          https://tug.org/svn/texlive?view=revision&revision=74579
Author:   lscarso
Date:     2025-03-11 23:12:37 +0100 (Tue, 11 Mar 2025)
Log Message:
-----------
MetaPost: fixed mp_hard_times (H.Hagen)

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/mplibdir/ChangeLog
    trunk/Build/source/texk/web2c/mplibdir/mp.w

Modified: trunk/Build/source/texk/web2c/mplibdir/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/mplibdir/ChangeLog	2025-03-11 20:11:50 UTC (rev 74578)
+++ trunk/Build/source/texk/web2c/mplibdir/ChangeLog	2025-03-11 22:12:37 UTC (rev 74579)
@@ -1,3 +1,7 @@
+2025-03-11   Luigi Scarso <luigi.scarso at gmail.com>
+
+	* Fixed mp_hard_times (H.Hagen)
+
 2025-03-07  Karl Berry  <karl at tug.org>
 
 	* TL'25 release.

Modified: trunk/Build/source/texk/web2c/mplibdir/mp.w
===================================================================
--- trunk/Build/source/texk/web2c/mplibdir/mp.w	2025-03-11 20:11:50 UTC (rev 74578)
+++ trunk/Build/source/texk/web2c/mplibdir/mp.w	2025-03-11 22:12:37 UTC (rev 74579)
@@ -10346,7 +10346,7 @@
   } else {
     set_number_from_div (n1, arc, d1); /* |n1 = (arc / d1)| */
     floor_scaled(n1);
-  }  
+  }
   number_clone (n, n1);
   set_number_from_mul (n1, n1, d1); /* |n1 = (n1 * d1)| */
   number_substract (arc, n1); /* |arc = arc - n1| */
@@ -10353,7 +10353,7 @@
 
   number_clone (d1, inf_t);         /* reuse |d1| */
   number_clone (v1, n);             /* |v1 = n| */
-    
+
   set_number_from_int(v1, number_to_int(v1)+1); /* |v1 = n1+1| */
   set_number_from_div (d1, d1, v1); /* |d1 = EL_GORDO / v1| */
   if (number_greater (t_tot, d1)) {
@@ -19323,7 +19323,7 @@
 
 @ @c
 void mp_print_sym  (mp_sym sym) {
-  printf("{type = %d, v = {type = %d, data = {indep = {scale = %d, serial = %d}, n = %d, str = %p, sym = %p, node = %p, p = %p}}, text = %p}\n", 
+  printf("{type = %d, v = {type = %d, data = {indep = {scale = %d, serial = %d}, n = %d, str = %p, sym = %p, node = %p, p = %p}}, text = %p}\n",
     sym->type, sym->v.type, (int)sym->v.data.indep.scale, (int)sym->v.data.indep.serial,
     sym->v.data.n.type, sym->v.data.str, sym->v.data.sym, sym->v.data.node, sym->v.data.p, sym->text);
   if (is_number(sym->v.data.n)) {
@@ -28265,72 +28265,89 @@
   mp_end_diagnostic (mp, false);
 }
 
-
 @ The |hard_times| routine multiplies a nice color or pair by a dependency list.
 
 @<Declare binary action procedures@>=
-static void mp_hard_times (MP mp, mp_node p) {
-  mp_value_node q;      /* a copy of the dependent variable |p| */
-  mp_value_node pp;     /* for typecasting p */
-  mp_node r;    /* a component of the big node for the nice color or pair */
-  mp_number v;     /* the known value for |r| */
-  new_number (v);
-  if (mp_type (p) <= mp_pair_type) {
-    q = (mp_value_node) mp_stash_cur_exp (mp);
-    mp_unstash_cur_exp (mp, p);
-    p = (mp_node) q;
-  }                             /* now |cur_type=mp_pair_type| or |cur_type=mp_color_type| or |cur_type=mp_cmykcolor_type| */
-  pp = (mp_value_node) p;
-  if (mp->cur_exp.type == mp_pair_type) {
-    r = x_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-    r = y_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-  } else if (mp->cur_exp.type == mp_color_type) {
-    r = red_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-    r = green_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-    r = blue_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-  } else if (mp->cur_exp.type == mp_cmykcolor_type) {
-    r = cyan_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-    r = yellow_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-    r = magenta_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-    r = black_part (value_node (cur_exp_node ()));
-    number_clone(v, value_number (r));
-    mp_new_dep (mp, r, mp_type (pp),
-                mp_copy_dep_list (mp, (mp_value_node) dep_list (pp)));
-    mp_dep_mult (mp, (mp_value_node) r, v, true);
-  }
-  free_number (v);
+static void mp_hard_times(MP mp, mp_node p)
+{
+    if (p->type <= mp_pair_type) {
+        mp_value_node q = (mp_value_node) mp_stash_cur_exp(mp);
+        mp_unstash_cur_exp(mp, p);
+        p = (mp_node) q;
+    }
+    switch (mp->cur_exp.type) {
+        case mp_pair_type:
+            {
+                mp_node e = value_node(cur_exp_node());
+                mp_number x, y;
+                new_number(x);
+                new_number(y);
+                number_clone(x, value_number(x_part(e)));
+                number_clone(y, value_number(y_part(e)));
+                mp_new_dep(mp, y_part(e), p->type, mp_copy_dep_list(mp, (mp_value_node) dep_list((mp_value_node) p)));
+                mp_free_value_node(mp, x_part(e));
+                x_part(e) = p;
+                set_mp_link(prev_dep(p), x_part(e));
+                mp_dep_mult(mp, (mp_value_node) x_part(e), x, true);
+                mp_dep_mult(mp, (mp_value_node) y_part(e), y, true);
+                free_number(x);
+                free_number(y);
+            }
+            break;
+        case mp_color_type:
+            {
+                mp_node e = value_node(cur_exp_node());
+                mp_number r, g, b;
+                new_number(r);
+                new_number(g);
+                new_number(b);
+                number_clone(r, value_number(red_part(e)));
+                number_clone(g, value_number(green_part(e)));
+                number_clone(b, value_number(blue_part(e)));
+                mp_new_dep(mp, blue_part(e),  p->type, mp_copy_dep_list(mp, (mp_value_node) dep_list((mp_value_node) p)));
+                mp_new_dep(mp, green_part(e), p->type, mp_copy_dep_list(mp, (mp_value_node) dep_list((mp_value_node) p)));
+                mp_free_value_node(mp, red_part(e));
+                red_part(e) = p;
+                set_mp_link(prev_dep(p), red_part(e));
+                mp_dep_mult(mp, (mp_value_node) red_part(e),   r, true);
+                mp_dep_mult(mp, (mp_value_node) green_part(e), g, true);
+                mp_dep_mult(mp, (mp_value_node) blue_part(e),  b, true);
+                free_number(r);
+                free_number(g);
+                free_number(b);
+            }
+            break;
+        case mp_cmykcolor_type:
+            {
+                mp_node e = value_node(cur_exp_node());
+                mp_number c, m, y, k;
+                new_number(c);
+                new_number(m);
+                new_number(y);
+                new_number(k);
+                number_clone(c, value_number(cyan_part(e)));
+                number_clone(m, value_number(magenta_part(e)));
+                number_clone(y, value_number(yellow_part(e)));
+                number_clone(k, value_number(black_part(e)));
+                mp_new_dep(mp, black_part(e),   p->type, mp_copy_dep_list(mp, (mp_value_node) dep_list((mp_value_node) p)));
+                mp_new_dep(mp, yellow_part(e),  p->type, mp_copy_dep_list(mp, (mp_value_node) dep_list((mp_value_node) p)));
+                mp_new_dep(mp, magenta_part(e), p->type, mp_copy_dep_list(mp, (mp_value_node) dep_list((mp_value_node) p)));
+                mp_free_value_node(mp, cyan_part(e));
+                cyan_part(e) = p;
+                set_mp_link(prev_dep(p), cyan_part(e));
+                mp_dep_mult(mp, (mp_value_node) cyan_part(e),    c, true);
+                mp_dep_mult(mp, (mp_value_node) magenta_part(e), m, true);
+                mp_dep_mult(mp, (mp_value_node) yellow_part(e),  y, true);
+                mp_dep_mult(mp, (mp_value_node) black_part(e),   k, true);
+                free_number(c);
+                free_number(m);
+                free_number(y);
+                free_number(k);
+            }
+            break;
+        default:
+            break;
+    }
 }
 
 @ @<Declare binary action...@>=



More information about the tex-live-commits mailing list.