home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume24 / chemtab / part01 / looke.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-12  |  6.3 KB  |  254 lines

  1. /*
  2.  * chemtab - a periodic table data base (C) 1990 Jim King pulsar@lsrhs
  3.  *
  4.  * looke.c - look for an element, then print known stats
  5.  */
  6.  
  7. #include <curses.h>
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include "element.h"
  11. #include "variables.h"
  12. #include "tune.h"
  13. #include "windows.h"
  14. #include "undefs.h"
  15.  
  16. /*
  17.  * matchstr(str)
  18.  * input: string
  19.  * return: int (number if found, 0 if not, -1 if ambiguous)
  20.  * purpose: match chemical names
  21.  */
  22. int    matchstr(str)
  23. char    *str;
  24. {
  25.     int    last, len, count = 0;
  26.     struct    elem    *tmp;
  27.  
  28.     len = strlen(str);
  29.  
  30.     for (tmp = e; tmp != NULL; tmp = tmp->next) {
  31.         if (!strncmp(str, tmp->name, len)) {
  32.             last = tmp->anum;
  33.             count++;
  34.         }
  35.     }
  36.     
  37.     if (!count) return(0);
  38.     else if (count > 1) return(-1);
  39.     else return(last);
  40. }
  41.  
  42. /*
  43.  * getlows(str)
  44.  *    input: none
  45.  *    output: string
  46.  *    purpose: get a lowercase string
  47.  */
  48. char *getlows()
  49. {
  50.     char    input[80];
  51.     int    i;
  52.  
  53.     gets(input);
  54.     for (i = 0; i < strlen(input); i++)
  55.         input[i] = tolower(input[i]);
  56.  
  57.     return(input);
  58. }
  59.  
  60. /*
  61.  * disp(l)
  62.  *    input:    l - int - referring to atomic number of elem. to display
  63.  *    output: curses only
  64.  *
  65.  * purpose:    separate the displaying from the rest of the subroutine
  66.  */
  67. disp(l)
  68. int    l;
  69. {
  70.     struct    elem    *tmp;
  71.     int    i;
  72.  
  73.     for (tmp = e; l != tmp->anum; tmp = tmp->next) ;
  74.  
  75.     wclear(mn); wrefresh(mn);
  76.     wclear(graph);
  77.     wmove(graph, 0, 0); wprintw(graph, "Atomic Name: %s", tmp->name);
  78.     wmove(graph, 1, 0); wprintw(graph, "Atomic Symbol: %s", tmp->sym);
  79.     wmove(graph, 2, 0); wprintw(graph, "Atomic Number: %d", tmp->anum);
  80.     wmove(graph, 3, 0); wprintw(graph, "Atomic Mass: %3.3f a.m.u.", tmp->amass);
  81.  
  82.     if (tmp->melt == MEL)
  83.         mvwaddstr(graph, 5, 0, "Melting Temp: NOT AVAILABLE");
  84.     else {
  85.         wmove(graph, 5, 0); wprintw(graph, "Melting Temp: %d Celcius (%4.0f Fahrenheit, %d Kelvin)", tmp->melt, ((float)tmp->melt * (9.0 / 5.0) + 32.0), tmp->melt + 273);
  86.     }
  87.     if (tmp->boil == BOI)
  88.         mvwaddstr(graph, 6, 0, "Boiling Temp: NOT AVAILABLE");
  89.  
  90.     else {
  91.         wmove(graph, 6, 0); wprintw(graph, "Boiling Temp: %d Celcius (%4.0f Fahrenheit, %d Kelvin)", tmp->boil, ((float)tmp->boil * (9.0 / 5.0) + 32.0), tmp->boil + 273);
  92.     }
  93.     if (tmp->spht == SPHT)
  94.         mvwaddstr(graph, 8, 0, "Specific Heat: NOT AVAILABLE");
  95.     else {
  96.         wmove(graph, 8, 0); wprintw(graph, "Specific Heat: %1.3f Calories/gram-Celcius", tmp->spht);
  97.     }
  98.     if (tmp->dens == DENS)
  99.         mvwaddstr(graph, 9, 0, "Density: NOT AVAILABLE");
  100.     else {
  101.         wmove(graph, 9, 0); wprintw(graph, "Density: %2.2f gram/cm cubed", tmp->dens);
  102.     }
  103.     if (tmp->arad == ARD)
  104.         mvwaddstr(graph, 10, 0, "Atomic Radius: NOT AVAILABLE");
  105.     else {
  106.         wmove(graph, 10, 0); wprintw(graph, "Atomic Radius: %1.2f Angstroms", tmp->arad);
  107.     }
  108.     if (tmp->eneg == ENG)
  109.         mvwaddstr(graph, 11, 0, "Electronegativity: NOT AVAILABLE");
  110.     else {
  111.         wmove(graph, 11, 0); wprintw(graph, "Electronegativity: %1.1f", tmp->eneg);
  112.     }
  113.     if (tmp->year == YEA)
  114.         mvwaddstr(graph, 12, 0, "Discovery Year: ANCIENT, B.C.");
  115.     else {
  116.         wmove(graph, 12, 0); wprintw(graph, "Discovery Year: %d A.D.", tmp->year);
  117.     }
  118.     mvwaddstr(graph, 14, 0, "Family: ");
  119.     switch(tmp->fam) {
  120.         case 1: wprintw(graph, "IA (1)"); break;
  121.         case 2: wprintw(graph, "IIA (2)"); break;
  122.         case 3: wprintw(graph, "IB (3)"); break;
  123.         case 4: wprintw(graph, "IIB (4)"); break;
  124.         case 5: wprintw(graph, "IIIB (5)"); break;
  125.         case 6: wprintw(graph, "IVB (6)"); break;
  126.         case 7: wprintw(graph, "VB (7)"); break;
  127.         case 8: wprintw(graph, "VIB (8)"); break;
  128.         case 9: wprintw(graph, "VIIB (9)"); break;
  129.         case 10: wprintw(graph, "VIIIB (10)"); break;
  130.         case 11: wprintw(graph, "VIXB (11)"); break;
  131.         case 12: wprintw(graph, "VXB (12)"); break;
  132.         case 13: wprintw(graph, "IIIA (13)"); break;
  133.         case 14: wprintw(graph, "IVA (14)"); break;
  134.         case 15: wprintw(graph, "VA (15)"); break;
  135.         case 16: wprintw(graph, "VIA (16)"); break;
  136.         case 17: wprintw(graph, "VIIA (17)"); break;
  137.         case 18: wprintw(graph, "VIIIA (18)"); break;
  138.         default: break;
  139.     }
  140.     wmove(graph, 15, 0);
  141.     wprintw(graph, "Row: %d\n", tmp->row);
  142.     wrefresh(graph);
  143.     capture(graph, 0, 0);
  144.     spc();    /* space to continue? */
  145. }
  146.     
  147. looke()
  148. {
  149.     struct    elem    *tmp;
  150.     char    *strn,                /* Random input string */
  151.         srch[80],            /* String comparison */
  152.         c = '5';            /* choice input */
  153.     int    i, elk;
  154.  
  155.     noecho(); crmode();
  156.     wclear(mn); wrefresh(mn);
  157.     wclear(srt); wrefresh(srt);
  158.     clear(); refresh();
  159.  
  160.     menu("View Elemental Information");
  161.     mvwaddstr(mn, 2, 0, "Look for element by:");
  162.     mvwaddstr(mn, 4, 0, "1] Atomic Name");
  163.     mvwaddstr(mn, 5, 0, "2] Atomic Number");
  164.     mvwaddstr(mn, 6, 0, "3] Atomic Symbol");
  165.     mvwaddstr(mn, 7, 0, "4] Return to Main Menu");
  166. l9:    mvwaddstr(mn, 9, 0, "Your Choice? ");
  167.     wrefresh(mn);
  168.     cur = mn; xp = 14; yp = 9;
  169.     noecho();
  170.     crmode();
  171. go:    c = wgetch(mn);
  172.     if (c == '?') { help(9); goto l9; }
  173.     if (c < '1' || c > '4') goto go;
  174.  
  175.     if (c == '4') {
  176.         wprintw(mn, "Return to Main Menu.");
  177.         wrefresh(mn);
  178.         wclear(mn);
  179.         return(0);
  180.     }
  181.     
  182.     if (c == '1') {        /* look by name */
  183.         wprintw(mn, "Look by Name (type in full or part of an element name)");
  184.         wclrtoeol(mn);
  185. l10:        mvwaddstr(mn, 11, 0, "Name of Element: ");
  186.         wrefresh(mn);
  187.         cur = mn; xp = 17; yp = 11;
  188.         echo();
  189.         nocrmode();
  190.         strcpy(srch, getlows());
  191.         if (srch[0] == '?') { help(10); goto l10; }
  192.     }
  193.  
  194.     if (c == '2') {        /* look by number */
  195.         wprintw(mn, "Look by Number");
  196.         wclrtoeol(mn);
  197. l11:        mvwaddstr(mn, 11, 0, "Atomic Number:   ");
  198.         wrefresh(mn);
  199.         cur = mn; xp = 17; yp = 11;
  200.         echo();
  201.         nocrmode();
  202.         gets(srch);
  203.         if (srch[0] == '?') { help(11); goto l11; }
  204.         if (atoi(srch) < 1) looke();
  205.     }
  206.  
  207.     if (c == '3') {        /* look by symbol */
  208.         wprintw(mn, "Look by Symbol");
  209.         wclrtoeol(mn);
  210. l12:        mvwaddstr(mn, 11, 0, "Atomic Symbol:   ");
  211.         wrefresh(mn);
  212.         cur = mn; xp = 17; yp = 11;
  213.         echo();
  214.         nocrmode();
  215.         gets(srch);
  216.         if (srch[0] == '?') { help(12); goto l12; }
  217.     }
  218.     
  219.     for (tmp = e; tmp != NULL; tmp = tmp->next) {
  220.         switch(c) {        /* then display it */
  221.             case '1':
  222.                 elk = matchstr(srch);
  223.                 switch(elk) {
  224.                     case -1:
  225.                         if (c == '1')
  226.                             mvwaddstr(mn, 11, 0, "Element name is ambiguous.");
  227.                         else
  228.                             mvwaddstr(mn, 11, 0, "Element symbol is ambiguous.");
  229.                         wrefresh(mn);
  230.                         sleep(2);
  231.                         goto nd;
  232.                     case 0: break;
  233.                     default: disp(elk); goto nd;
  234.                 }
  235.                 break;
  236.             case '3':
  237.                 if (strcmp(srch, tmp->sym) == 0) {
  238.                     disp(tmp->anum); goto nd;
  239.                 } else break;
  240.             default:
  241.                 if (atoi(srch) == tmp->anum) {
  242.                     disp(tmp->anum); goto nd;
  243.                 } else
  244.                     break;
  245.         }
  246.     }
  247.     mvwaddstr(mn, 10, 0, "No such element:");
  248.     wrefresh(mn);
  249.     sleep(2);
  250. nd:    wclear(graph); wrefresh(graph);
  251.     wclear(mn); wrefresh(mn);
  252.     looke();
  253. }
  254.