Blame c/gtk3/calc-line/calcline.c

3c7729
#include <stdlib.h></stdlib.h>
3c7729
#include <stdio.h></stdio.h>
3c7729
#include <string.h></string.h>
3c7729
#include <gtk gtk.h=""></gtk>
3c7729
3c7729
3c7729
void changed(GtkEditable *editable, gpointer data) {
3c7729
  const char *text = gtk_entry_get_text(GTK_ENTRY(editable));
3c7729
  double result = 0.0;
3c7729
  for(const char *c = text; c; ++c) {
3c7729
    if (*c == '+' || *c == '-' || *c == '*' || *c == '/') {
3c7729
      char *end;
3c7729
      double a = strtof(text, &end);
3c7729
      double b = strtof(c + 1, &end);
3c7729
      if (*c == '+') result = a + b;
3c7729
      if (*c == '-') result = a - b;
3c7729
      if (*c == '*') result = a * b;
3c7729
      if (*c == '/') result = a / b;
3c7729
    } else
3c7729
    if (*c == '=') {
3c7729
      int size = c - text + 1;
3c7729
      char *new_text = malloc(size + 20);
3c7729
      memcpy(new_text, text, size);
3c7729
      sprintf(new_text + size, "%g", result);
3c7729
      gtk_entry_set_text(GTK_ENTRY(editable), new_text);
3c7729
      free(new_text);
3c7729
      break;
3c7729
    }
3c7729
  }
3c7729
}
3c7729
3c7729
void activate(GtkApplication* app, gpointer data) {
3c7729
  GtkWidget *window = gtk_application_window_new(app);
3c7729
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
3c7729
  
3c7729
  GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
3c7729
  gtk_container_add(GTK_CONTAINER(window), vbox);
3c7729
3c7729
  GtkWidget *label = gtk_label_new("Enter simple expression like: 2+3=");
3c7729
  gtk_container_add(GTK_CONTAINER(vbox), label);
3c7729
  
3c7729
  GtkWidget *entry = gtk_entry_new();
3c7729
  g_signal_connect(entry, "changed", G_CALLBACK(changed), NULL);
3c7729
  gtk_container_add(GTK_CONTAINER(vbox), entry);
3c7729
  
3c7729
  gtk_widget_show_all(window);
3c7729
}
3c7729
3c7729
int main(int argc, char **argv) {
3c7729
  GtkApplication *application = gtk_application_new(NULL, 0);
3c7729
  g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
3c7729
  int status = g_application_run(G_APPLICATION(application), argc, argv);
3c7729
  g_object_unref(application);
3c7729
  return status;
3c7729
}
3c7729