adresse book with C programming, i have problem with library i think, couldn't complite my code

Posted by osabri on Stack Overflow See other posts from Stack Overflow or by osabri
Published on 2010-06-06T20:10:26Z Indexed on 2010/06/06 20:12 UTC
Read the original article Hit count: 561

Filed under:

I've divided my code in small programm so it can be easy to excute

/* ab_error.c : in case of errors following messages will
be displayed */

#include "adressbook.h"

static char *errormsg[] = 
{ "", 
 "\nNot enough space on disk",
 "\nCannot open file",
 "\nCannot read file",
 "\nCannot write file"
};

void check(int error)
{
 switch(error)
 {
  case 0:
   return;
  case 1: write_file();
  case 2:
  case 3:
  case 4:
    system("cls");
    fputs(errormsg[error], stderr);
    exit(error);

 }
}

2nd

/* ab_fileio.c : functions for file input/output */

include "adressbook.h"

static char ab_file[] = "ADRESSBOOK.DAT"; //file to save the entries

int read_file(void) { int error = 0; FILE *fp; ELEMENT *new_e, *last_e = NULL; DATA buffer;

if( (fp = fopen(ab_file, "rb")) == NULL) return -1; //no file found

while (fread(&buffer, sizeof(DATA), 1, fp) == 1) 
//reads one list element after another
{
        if( (new_e = make_element()) == NULL)
        {
            error = 1; break;      //not enough space
        }
        new_e->person = buffer;    //copy data to new element
        new_e->next = NULL;

        if(hol.first == NULL)      //list is empty?
           hol.first = new_e;      //yes
        else                       
            last_e->next = new_e;    //no

        last_e = new_e;
        ++hol.amount;
}
if( !error && !feof(fp) )
    error = 3;      //cannot read file

fclose(fp);
return error;

} /-------------------------------/

int write_file(void) { int error = 0; FILE *fp; ELEMENT *p;

if( (p = hol.first) == NULL) return 0; //list is empty

if( (fp = fopen(ab_file, "wb")) == NULL) return 2; //cannot open

while( p!= NULL)
{
       if( fwrite(&p->person, sizeof(DATA), 1, fp) < 1)
       {
           error = 4; break;            //cannot write
       }
       p = p->next;
}
fclose(fp);
return error;

}

3rd

/* ab_list.c : functions to manipulate the list */

#include "adressbook.h"

HOL hol = {0, NULL}; //global definition for head of list

  /* -------------------- */

ELEMENT *make_element(void)
{
 return (ELEMENT *)malloc( sizeof(ELEMENT) );
}

  /* -------------------- */

int ins_element( DATA *newdata)
{
 ELEMENT *new_e, *pre_p;

 if((new_e = make_element()) == NULL)
  return 1;

 new_e ->person = *newdata; // copy data to new element

 pre_p = search(new_e->person.family_name);

 if(pre_p == NULL) //no person in list
 {
  new_e->next = hol.first; //put it to the begin
  hol.first = new_e;
 }
 else
 {
  new_e->next = pre_p->next;
  pre_p->next = new_e;
 }
 ++hol.amount;
 return 0;
}

int erase_element( char name, char surname )
{
return 0;

}
  /* ---------------------*/
ELEMENT *search(char *name)
{
 ELEMENT *sp, *retp; //searchpointer, returnpointer

 retp = NULL;
 sp = hol.first;
 while(sp != NULL && sp->person.family_name != name)
 {
  retp = sp;
  sp = sp->next;
 }
 return(retp);
}

4th

/* ab_screen.c : functions for printing information on screen   */

#include "adressbook.h"
#include <conio.h>
#include <ctype.h>

         /* standard prompts for in- and output */
static char pgmname[] = "---- Oussama's Adressbook made in splendid C ----";

static char options[] = "\
                      1: Enter new adress\n\n\
                      2: Delete entry\n\n\
                      3: Change entry\n\n\
                      4: Print adress\n\n\
                    Esc: Exit\n\n\n\
Your choice . . .: ";

static char prompt[] = "\
            Name . . . .:\n\
            Surname . . :\n\n\
            Street . . .:\n\n\
            House number:\n\n\
            Postal code :\n\n\
            Phone number:";

static char buttons[] = "\
<Esc> = cancel input  <Backspace> = correct input\
<Return> = assume";

static char headline[] = "\
   Name      Surname     Street     House     Postal code    Phone number  \n\
   ------------------------------------------------------------------------";

static char further[] = "\
-------- continue with any key --------";

         /* ---------------------------------- */

int menu(void)                        //show menu and read user input
{
 int c;
 system ("cls");
 set_cur(0,20); puts(pgmname);
 set_cur(6,0);  printf("%s", options);

 while( (c = getch()) != ESC && (c < '1' || c > '4'))
        putch('\a');
 return c;
}    
        /* ---------------------------------- */

int print_adr_book(void)     //display adressbook
{
    int line = 1;
    ELEMENT *p = hol.first;

    system("cls");
    set_cur(0,20); puts(pgmname);
    set_cur(2,0); puts(headline);

    set_cur(5,0);
    while(p != NULL)         //run through list and show entries
    {
      printf("%5d  %-15s  ",line, p->person.family_name);
      printf("%-12s %-15s ", p->person.given_name, p->person.street);
      printf("%-4d %-5d %-12d\n",p->person.house_number, p->person.postal_code, p->person.phone);

      p = p->next;

      if( p == NULL || ++line %16 == 1) //end of list or screen is full     
      {
          set_cur(24,0); printf("%s",further);
          if( getch() == ESC)
              return 0;
          set_cur(5,0); scroll_up(0,5,24);//puts(headline);
      }

    }
    return 0;
}
    /* -------------------------------------------*/

int make_entry(void)
{
    char cache[50];
    DATA newperson; 
    ELEMENT *p;

    while(1)
    {
            system("cls"); set_cur(0,20); puts(pgmname);

            set_cur(6,0); puts("Please enter new data:");
            set_cur(10,0); puts(prompt);
            set_cur(24,0); printf("%s",buttons);

   balken(10, 25, MAXL, ' ',0x70); //input name
   if(input(newperson.family_name, MAXL, ESC, CR) == ESC)
    return 0;

   balken(12,25, MAXL, ' ', 0x70); //surname
   if(input(newperson.given_name, MAXL, ESC, CR) == ESC)
    return 0;

   balken(14,25, 30, ' ', 0x70); //street
   if(input(newperson.street, 30, ESC, CR) == ESC)
    return 0;

   balken(16,25, 4, ' ',0x70); //housenumber
   if(input(cache, 4, ESC, CR) == ESC)
    return 0;
   newperson.house_number = atol(cache); //to string


   balken(18,25, 5, ' ',0x70); //postal code
   if(input(cache, 5, ESC, CR) == ESC)
    return 0;
   newperson.postal_code = atol(cache); //to string

   balken(20,25, 20, ' ',0x70); //phone number
   if(input(cache, 20, ESC, CR) == ESC)
    return 0;
   newperson.phone = atol(cache); //to string

   p = search(newperson.phone);

   if( p!= NULL && p->person.phone == newperson.phone)
   {
    set_cur(22,25);
    puts("phonenumber already exists!");
    set_cur(24,0); printf("%s, further"); getch();
    continue;
   }

 }
}

5th

/* adress_book_project.c : main program to create an adressbook */
/* copyrights by Oussama Sabri, June 2010                       */

#include "adressbook.h"  //project header file 

int main()
{
    int rv, cmd; //return value, user command

    if ( (rv = read_file() ) == -1) // no data saved yet
       rv = make_entry();
       check(rv); //prompts an error and quits program on disfunction

    do
    {
                  switch (cmd = menu())//calls menu and gets user input back
                  {
                         case '1':
                                  rv = make_entry();
                                  break;
                         case '2':  //delete entry
                         case '3':  //changes entry
                                  rv = change_entry(cmd);
                                  break;
                         case '4':  //prints adressbook on screen
                                  rv = print_adr_book();
                                  break;
                         case ESC: //end of program
                                  system ("cls"); rv = 0;
                                  break;              
                  } 


    }while(cmd!= ESC);

    check ( write_file() );        //save adressbook                   
    return 0;
}  

6th

/*  Getcb.c  -->  Die Funktion getcb() liefert die naechste        *
 *                Tastatureingabe (ruft den BIOS-INT 0x16 auf).    *
 *                Return-Wert:                                     *
 *                ASCII-Code  bzw.  erweiterter Code + 256         */

/* Hinweis:  Es muss ein DOS-Compiler verwendet werden.            *
 *           (z.B. der GNU-Compiler fuer DOS auf der CD)           */

#include <dos.h>

int getcb(void)
{
    union REGS intregs;

    intregs.h.ah = 0;                 // Subfunktion 0: ein Zeichen 
                                      // von der Tastatur lesen. 
    int86( 0x16, &intregs, &intregs);

    if( intregs.h.al != 0)                 // Falls ASCII-Zeichen,
       return (intregs.h.al);              // dieses zurueckgeben.
    else                                   // Sonst den erweiterten
       return (intregs.h.ah + 0x100);      // Code + 256  
}

7th

/*  PUTCB.C  -->  enthaelt die Funktionen                        *
 *                     -  putcb()                                *
 *                     -  putcb9()                               *
 *                     -  balken()                               *
 *                     -  input()                                * 
 *                                                               *
 *  Es werden die Funktionen 9 und 14 des Video-Interrupts       *
 *  (ROM-BIOS-Interrupt 0x10) verwendet.                         *
 *                                                               *
 *  Die Prototypen dieser Funktionen stehen in BIO.H             */

/* Hinweis: Es muss ein DOS-Compiler verwendet werden.           *
 *          (z.B. der GNU-Compiler fuer DOS auf der CD)          */

#include <dos.h>
#define  VIDEO_INT  0x10


/*----------------------------------------------------------------
 * putcb(c)    gibt das Zeichen auf der aktuellen Cursor-Position
 *             am Bildschirm aus. Der Cursor wird versetzt.
 *             Steuerzeichen Back-Space, CR, LF und BELL werden
 *             ausgefuehrt.
 *             Return-Wert:  keiner
 */

void  putcb(unsigned char c)        /* Gibt das Zeichen in c auf  */
{                                   /* den Bildschirm aus.        */
      union REGS  intregs;

      intregs.h.ah = 14;          /*  Subfunktion 14 ("Teletype") */
      intregs.h.al = c;
      intregs.h.bl = 0xf;               /*  Vordergrund-Farbe im  */
                                        /*  Grafik-Modus.         */
      int86(VIDEO_INT, &intregs, &intregs);
}


/*----------------------------------------------------------------
 * putcb9(c,count,mode)  gibt das Zeichen in c count-mal im
 *                       angegebenen Modus auf der aktuellen
 *                       Cursor-Position am Bildschirm aus.
 *                       Der Cursor wird nicht versetzt.
 *
 *                       Return-Wert: keiner
 */

void  putcb9( unsigned char c,                   /*  das Zeichen  */
              unsigned count,                    /*  die Anzahl   */
              unsigned mode )    /* Low-Byte:  das Atrribut       */
{                                /* High-Byte: die Bildschirmseite*/
      union REGS intregs;

      intregs.h.ah = 9;           /*  Subfunktion 9 des Int 0x10  */
      intregs.h.al = c;
      intregs.x.bx = mode;
      intregs.x.cx = count;

      int86( VIDEO_INT, &intregs, &intregs);
}


/*----------------------------------------------------------------
 * balken()   positioniert den Cursor und zeichnet einen Balken,
 *            wobei Position, L„nge, Fllzeichen und Attribut
 *            als Argumente bergeben werden.
 *            Der Cursor bleibt auf der ersten Position im Balken.
 */

void balken( unsigned int  zeile,           /* Start-Position     */
             unsigned int  spalte,
             unsigned int  laenge,          /* Laenge des Balkens */
             unsigned char  c,              /* Fuellzeichen       */
             unsigned int  modus)   /* Low-Byte:  Attribut        */
                                    /* High-Byte: Bildschirmseite */
{
     union REGS  intregs;

     intregs.h.ah = 2;              /* Cursor auf der angegebenen */
     intregs.h.dh = zeile;          /* Bildschirmseite versetzen. */
     intregs.h.dl = spalte;
     intregs.h.bh = (modus >> 8);
     int86(VIDEO_INT, &intregs, &intregs);

     putcb9(c, laenge, modus);                /* Balken ausgeben. */
}

/*----------------------------------------------------------------
 * input()   liest Zeichen von der Tastatur ein und haengt '\0' an.
 *           Mit Backspace kann die Eingabe geloescht werden.
 *           Das Attribut am Bildschirm bleibt erhalten.
 *
 *  Argumente:  1. Zeiger auf den Eingabepuffer.
 *              2. Anzahl maximal einzulesender Zeichen.
 *              3. Die optionalen Argumente: Zeichen, mit denen die
 *                 Eingabe abgebrochen werden kann.
 *                 Diese Liste muá mit CR = '\r' enden!
 *  Return-Wert: Das Zeichen, mit dem die Eingabe abgebrochen wurde.
 */

 #include <stdarg.h>
 int getcb( void);                     /* Zum Lesen der Tastatur  */

 int input(char *puffer, int max,... )
 {
      int c;                              /* aktuelles Zeichen  */
      int breakc;                         /* Abruchzeichen      */
      int nc = 0;           /* Anzahl eingelesener Zeichen      */
      va_list argp;         /* Zeiger auf die weiteren Arumente */

      while(1)
      {
          *puffer = '\0';
          va_start(argp, max);         /* argp initialisieren   */
          c = getcb();

          do        /* Mit Zeichen der Abbruchliste vergleichen */
              if(c == (breakc = va_arg(argp,int)) )
                 return(breakc);
          while( breakc != '\r' );

          va_end( argp);

          if( c == '\b' &&  nc > 0)               /* Backspace? */
          {
              --nc;  --puffer;
              putcb(c);  putcb(' '); putcb(c);
          }
          else if( c >= 32  &&  c <= 255  &&  nc < max )
          {
              ++nc;   *puffer++ = c;   putcb(c);
          }
          else if( nc == max)
              putcb('\7');                     /* Ton ausgeben  */
      }
}

8th

/*  Video.c  --> Enthaelt die Funktionen
 *                  cls(),
 *                  scroll_up(),       scroll_down(),
 *                  set_cur(),         get_cur(),
 *                  set_screen_page(), get_screen_page()
 *
 *  Die Prototypen dieser Funktionen befinden sich in BIO.H
 */

/* Hinweis: Es muss ein DOS-Compiler verwendet werden.          *
 *          (z.B. der GNU-Compiler fuer DOS auf der CD)         */

#include <dos.h>
#include "bio.h"
#define  VIDEO_INT  0x10

typedef  unsigned char  BYTE;

void scroll_up( int anzahl, int anf_zeile, int end_zeile)
{                                       /* Fenster hoch rollen. */
     union REGS  intregs;

     intregs.x.ax = 0x600 + anzahl;      /* Subfunktion AH = 6, */
                                         /* AL = Anzahl Zeilen. */
     intregs.x.cx = anf_zeile << 8;      /* CH=anf_zeile, cl=0  */
     intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
     intregs.h.bh = 7;                    /* normales Attribut  */

     int86(VIDEO_INT, &intregs, &intregs);
}

void scroll_down( int anzahl, int anf_zeile, int end_zeile)
{                                     /* Fenster runter rollen. */
     union REGS  intregs;

     intregs.x.ax = 0x700 + anzahl;      /* Subfunktion AH = 7, */
                                         /* AL = Anzahl Zeilen. */
     intregs.x.cx = anf_zeile << 8;      /* CH=anf_zeile, cl=0  */
     intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
     intregs.h.bh = 7;                    /* normales Attribut  */

     int86(VIDEO_INT, &intregs, &intregs);
}

void set_cur( int zeile, int spalte)    /* versetzt den Cursor  */
{                              /* der aktuellen Bildschirmseite.*/
     union REGS  intregs;

     intregs.h.ah = 2;
     intregs.h.dh = (BYTE)zeile;
     intregs.h.dl = (BYTE)spalte;
     intregs.h.bh = (BYTE)get_screen_page();

     int86(VIDEO_INT, &intregs, &intregs);
}

void get_cur(int *zeile, int *spalte)    /* holt die Cursor-    */
{                     /* Position der aktuellen Bildschirmseite.*/
     union REGS  intregs;

     intregs.h.ah = 3;
     intregs.h.bh = (BYTE)get_screen_page();

     int86(VIDEO_INT, &intregs, &intregs);

     *zeile  = (unsigned)intregs.h.dh;
     *spalte = (unsigned)intregs.h.dl;
}

void cls(void)
{
     scroll_up(0,0,24);        /* Gesamten Bildschirm loeschen. */
     set_cur(0,0);             /* Cursor in Home-Position.      */
}

int get_screen_page(void)     /* Aktuelle Bildschirmseite holen.*/
{
     union REGS  intregs;

     intregs.h.ah = 15;        /* Subfunktion AH = 15:          */
                               /* Bildschirm-Modus feststellen. */
     int86(VIDEO_INT, &intregs, &intregs);

     return (intregs.h.bh);
}

void set_screen_page(int seite)   /* setzt die aktive Seite des */
{                                 /* Bildschirmpuffers auf die  */
                                  /* angegebene Seite.          */
     union REGS  intregs;

     intregs.x.ax = 0x500 + seite;        /* Subfunktion AH = 5 */

     int86(VIDEO_INT, &intregs, &intregs);
}


/*  -------------------------------------------------------------
             Ein kleines Testprogramm :
*/
/*
#include <stdio.h>

int main()
{
    cls();
    set_cur(23, 0);  printf("Weiter mit <Return>\n");

    set_cur(12, 20); printf("Ein Test!\n");
    getchar();

    scroll_up(3, 5, 20);
    getchar();

    scroll_down(6, 5, 20);
    getchar();

    set_screen_page(1);
    printf("\nAuf der 2. Seite !\n"); 
    getchar();

    set_screen_page(0);
    set_cur(0,0);
    printf("\nWieder auf der 1. Seite !\n"); 
    getchar();

    cls();

    return 0;
}
*/

/*  Video.c  --> Enthaelt die Funktionen
 *                  cls(),
 *                  scroll_up(),       scroll_down(),
 *                  set_cur(),         get_cur(),
 *                  set_screen_page(), get_screen_page()
 *
 *  Die Prototypen dieser Funktionen befinden sich in BIO.H
 */

/* Hinweis: Es muss ein DOS-Compiler verwendet werden.          *
 *          (z.B. der GNU-Compiler fuer DOS auf der CD)         */

#include <dos.h>
#include "bio.h"
#define  VIDEO_INT  0x10

typedef  unsigned char  BYTE;

void scroll_up( int anzahl, int anf_zeile, int end_zeile)
{                                       /* Fenster hoch rollen. */
     union REGS  intregs;

     intregs.x.ax = 0x600 + anzahl;      /* Subfunktion AH = 6, */
                                         /* AL = Anzahl Zeilen. */
     intregs.x.cx = anf_zeile << 8;      /* CH=anf_zeile, cl=0  */
     intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
     intregs.h.bh = 7;                    /* normales Attribut  */

     int86(VIDEO_INT, &intregs, &intregs);
}

void scroll_down( int anzahl, int anf_zeile, int end_zeile)
{                                     /* Fenster runter rollen. */
     union REGS  intregs;

     intregs.x.ax = 0x700 + anzahl;      /* Subfunktion AH = 7, */
                                         /* AL = Anzahl Zeilen. */
     intregs.x.cx = anf_zeile << 8;      /* CH=anf_zeile, cl=0  */
     intregs.x.dx = (end_zeile <<8) | 79; /* DH=end_zeile,DL=79 */
     intregs.h.bh = 7;                    /* normales Attribut  */

     int86(VIDEO_INT, &intregs, &intregs);
}

void set_cur( int zeile, int spalte)    /* versetzt den Cursor  */
{                              /* der aktuellen Bildschirmseite.*/
     union REGS  intregs;

     intregs.h.ah = 2;
     intregs.h.dh = (BYTE)zeile;
     intregs.h.dl = (BYTE)spalte;
     intregs.h.bh = (BYTE)get_screen_page();

     int86(VIDEO_INT, &intregs, &intregs);
}

void get_cur(int *zeile, int *spalte)    /* holt die Cursor-    */
{                     /* Position der aktuellen Bildschirmseite.*/
     union REGS  intregs;

     intregs.h.ah = 3;
     intregs.h.bh = (BYTE)get_screen_page();

     int86(VIDEO_INT, &intregs, &intregs);

     *zeile  = (unsigned)intregs.h.dh;
     *spalte = (unsigned)intregs.h.dl;
}

void cls(void)
{
     scroll_up(0,0,24);        /* Gesamten Bildschirm loeschen. */
     set_cur(0,0);             /* Cursor in Home-Position.      */
}

int get_screen_page(void)     /* Aktuelle Bildschirmseite holen.*/
{
     union REGS  intregs;

     intregs.h.ah = 15;        /* Subfunktion AH = 15:          */
                               /* Bildschirm-Modus feststellen. */
     int86(VIDEO_INT, &intregs, &intregs);

     return (intregs.h.bh);
}

void set_screen_page(int seite)   /* setzt die aktive Seite des */
{                                 /* Bildschirmpuffers auf die  */
                                  /* angegebene Seite.          */
     union REGS  intregs;

     intregs.x.ax = 0x500 + seite;        /* Subfunktion AH = 5 */

     int86(VIDEO_INT, &intregs, &intregs);
}


/*  -------------------------------------------------------------
             Ein kleines Testprogramm :
*/
/*
#include <stdio.h>

int main()
{
    cls();
    set_cur(23, 0);  printf("Weiter mit <Return>\n");

    set_cur(12, 20); printf("Ein Test!\n");
    getchar();

    scroll_up(3, 5, 20);
    getchar();

    scroll_down(6, 5, 20);
    getchar();

    set_screen_page(1);
    printf("\nAuf der 2. Seite !\n"); 
    getchar();

    set_screen_page(0);
    set_cur(0,0);
    printf("\nWieder auf der 1. Seite !\n"); 
    getchar();

    cls();

    return 0;
}
*/

/*  BIO.H  -->  Enthaelt die Prototypen der BIOS-Funktionen.    */


/*         ---       Funktionen in VIDEO.C       ---            */

extern  void scroll_up(int anzahl, int anf_zeile,int  end_zeile);
extern  void scroll_down(int anzahl, int anf_zeile, int end_zeile);
extern  void set_cur(int zeile, int spalte);
extern  void get_cur(int *zeile, int *spalte);
extern  void cls(void);
extern  int  get_screen_page(void);
extern  void set_screen_page(int page);


/*       ---     Funktionen in GETCB.C / PUTCB.C      ---       */

extern  int  getcb(void);
extern  void putcb(int c);
extern  void putcb9(int c, unsigned count, unsigned modus);
extern  void balken(int zeile, int spalte, int laenge, int c, unsigned modus);
extern  int input(char *puffer, int max,... );

need your help, can't find my mistakes:((

© Stack Overflow or respective owner

Related posts about c