Commit e73ef68c authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add the '(set {width,height,dpi} <value>)' statement

parent 80b5fd57
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -50,6 +50,20 @@ ReturnCode element_build_all(
    const Expr* expr,
    std::vector<ElementRef>* elems) {
  for (; expr; expr = expr_next(expr)) {
    if (!expr || !expr_is_list(expr)) {
      return error(ERROR, "expected an element list");
    }

    auto args = expr_get_list(expr);
    if (!args || !expr_is_value(args)) {
      return error(ERROR, "expected an element name");
    }

    auto arg0 = expr_get_value(args);
    if (arg0 == "set" || arg0 == "define") {
      continue;
    }

    ElementRef elem;
    if (auto rc = element_build(env, expr, &elem); !rc) {
      return rc;
+47 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
 */
#include "environment.h"
#include "core/format.h"
#include "sexpr_conv.h"
#include "sexpr_util.h"
#include "graphics/font_lookup.h"

using namespace std::placeholders;
@@ -38,5 +40,50 @@ ReturnCode environment_setup_defaults(Environment* env) {
  return OK;
}

ReturnCode environment_set(Environment* env, const Expr* expr) {
  auto args = expr_collect(expr);
  if (args.size() < 2) {
    return error(ERROR, "'set' expects two arguments");
  }

  if (expr_is_value(args[0], "width")) {
    return expr_to_measure(args[1], &env->screen_width);
  }

  if (expr_is_value(args[0], "height")) {
    return OK;
    return expr_to_measure(args[1], &env->screen_height);
  }

  if (expr_is_value(args[0], "dpi")) {
    return OK;
    return expr_to_float64(args[1], &env->dpi);
  }

  return errorf(ERROR, "invalid property: {}", expr_get_value(args[0]));
}

ReturnCode environment_configure(Environment* env, const Expr* expr) {
  for (; expr; expr = expr_next(expr)) {
    if (!expr || !expr_is_list(expr)) {
      return errorf(ERROR, "expected a list but got: {}", expr_inspect(expr));
    }

    auto args = expr_get_list(expr);
    if (!args || !expr_is_value(args)) {
      return error(ERROR, "expected an element name");
    }

    auto arg0 = expr_get_value(args);
    if (arg0 == "set" ) {
      if (auto rc = environment_set(env, expr_next(args)); !rc) {
        return rc;
      }
    }
  }

  return OK;
}

} // namespace fviz
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ struct Environment {

ReturnCode environment_setup_defaults(Environment* env);

ReturnCode environment_configure(Environment* env, const Expr* e);

} // namespace fviz

+6 −0
Original line number Diff line number Diff line
@@ -90,6 +90,12 @@ int fviz_configure(
  }

  if (auto rc = environment_setup_defaults(&ctx->env); !rc) {
    fviz_seterr(ctx, rc);
    return rc;
  }

  if (auto rc = environment_configure(&ctx->env, ctx->expr.get()); !rc) {
    fviz_seterr(ctx, rc);
    return rc;
  }

+5 −7
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ ReturnCode parse_measure(
  try {
    value = std::stod(s, &unit_pos);
  } catch (... ) {
    return ERROR;
    return errorf(ERROR, "invalid number: '{}'", s);
  }

  if (unit_pos == s.size()) {
@@ -99,12 +99,10 @@ ReturnCode parse_measure(
    return OK;
  }

  return {
  return errorf(
      ERROR,
    fmt::format(
      "invalid unit: '{}', expected one of 'px', 'pt', 'em', 'rem', 'rel' or '%'",
        unit)
  };
      unit);
}

Measure measure_or(const Measure& primary, const Measure& fallback) {
Loading