guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Clean Guile code from C program


From: Jose Martin
Subject: Clean Guile code from C program
Date: Fri, 7 Mar 2008 13:02:33 -0500 (EST)

Hi all, I need to use a program in C that is designed to be used in Guile. I'm 
not a Guile user myself so I don't know well how to remove the Guile code from 
the C program, so that I can run it without Guile (Please, don't be ofended for 
that ;) ).



I looked at the program's code and it looks a bit difficult to change it, and I 
must say I'm a beginner in C. Could anyone give me the steps of the changes I'd 
need to remove Guile-dependent code from C code?



The program has about 10 files, so here I'm pasting only one of the files. The 
code is open-source so I could share it if anyone wants to see the other files.



I'd massively appreciate any help. Thanks,



Jose



-- ATTACHED CODE --



#include <guile/gh.h>

...



#define INFO contain

#define TEXTMGRP(x) (SCM_NIMP(x) && SCM_CAR(x) == (SCM)scm_tc16_textmgr)

#define TEXTMGR(x) ((TextFile*) SCM_CDR(x))



long scm_tc16_textmgr;



SCM mark_textmgr(SCM obj)

{

  SCM_SETGC8MARK(obj);

  return SCM_BOOL_F;

}



size_t free_textmgr(SCM obj)

{

  if (TEXTMGR(obj)) {

    TEXTMGR(obj)->foreach(markref);

    TEXTMGR(obj)->hashtable()->foreach(decref);

    delete TEXTMGR(obj);

  }

  return 0;

}



int print_textmgr(SCM obj, SCM port, scm_print_state * pstate)

{

  scm_puts("#<TEXT: ", port);

  scm_puts(TEXTMGR(obj)->filename(), port);

  scm_puts(">", port);

  return 1;

}



SCM textmgr2scm(TextFile* text)

{

  SCM result;

  SCM_NEWCELL(result);

  SCM_SETCAR(result, (SCM) scm_tc16_textmgr);

  SCM_SETCDR(result, (SCM) text);

  return result;

}





SCM_PROC(s_open_text, "open-text", 1, 0, 0, open_text);

SCM open_text(SCM name)

{

  SCM txt;

  if (scm_string_p(name) != SCM_BOOL_T)

    scm_wrong_type_arg(s_open_text, 1, name);

  txt = textmgr2scm(new TextFile(SCM_CHARS(name)));

  TEXTMGR(txt)->foreach(markref);

  TEXTMGR(txt)->hashtable()->foreach(incref);

  return txt;

}



SCM_PROC(s_append_text, "append-text", 2, 0, 0, append_text);

SCM append_text(SCM obj, SCM name)

{

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_append_text, 1, obj);

  if (!TEXTMGR(obj))

    scm_misc_error(s_append_text, "Text object is empty", SCM_EOL);

  if (scm_string_p(name) != SCM_BOOL_T)

    scm_wrong_type_arg(s_append_text, 2, name);

  TEXTMGR(obj)->foreach(markref);

  TEXTMGR(obj)->hashtable()->foreach(decref);

  TEXTMGR(obj)->append(SCM_CHARS(name));

  TEXTMGR(obj)->foreach(markref);

  TEXTMGR(obj)->hashtable()->foreach(incref);

  return obj;

}



SCM_PROC(s_close_text, "close-text", 1, 0, 0, close_text);

SCM close_text(SCM obj)

{

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_close_text, 1, obj);

  if (TEXTMGR(obj)) {

    scm_gc();

    TEXTMGR(obj)->foreach(markref);

    TEXTMGR(obj)->hashtable()->foreach(decref);

    TEXTMGR(obj)->hashtable()->removeif(delrefp);

    delete TEXTMGR(obj);

    SCM_SETCDR(obj, 0);

  }

  return SCM_UNSPECIFIED;

}



SCM_PROC(s_rewind_text, "rewind-text", 1, 0, 0, rewind_text);

SCM rewind_text(SCM obj)

{

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_rewind_text, 1, obj);

  if (!TEXTMGR(obj))

    scm_misc_error(s_rewind_text, "Text object is empty", SCM_EOL);

  TEXTMGR(obj)->rewind();

  return SCM_UNSPECIFIED;

}



SCM_PROC(s_get_next_word, "get-next-word", 1, 0, 0, get_next_word);

SCM get_next_word(SCM obj)

{

  contain* cn;

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_get_next_word, 1, obj);

  if (!TEXTMGR(obj))

    scm_misc_error(s_get_next_word, "Text object is empty", SCM_EOL);

  cn = TEXTMGR(obj)->getnext();

  if (cn)

    return cn->content;

  else

    return SCM_BOOL_F;

}



SCM_PROC(s_get_word, "get-word", 2, 0, 0, get_word);

SCM get_word(SCM obj, SCM n)

{

  contain* cn;

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_get_word, 1, obj);

  if (!TEXTMGR(obj))

    scm_misc_error(s_get_word, "Text object is empty", SCM_EOL);

  if (scm_integer_p(n) != SCM_BOOL_T)

    scm_wrong_type_arg(s_get_word, 2, n);

  cn = TEXTMGR(obj)->get(gh_scm2int(n));

  if (cn)

    return cn->content;

  else

    return SCM_BOOL_F;

}



SCM_PROC(s_scramble_text, "scramble-text", 1, 0, 0, scramble_text);

SCM scramble_text(SCM obj)

{

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_scramble_text, 1, obj);

  if (!TEXTMGR(obj))

    scm_misc_error(s_scramble_text, "Text object is empty", SCM_EOL);

  return textmgr2scm(TEXTMGR(obj)->scramble());

}



static SCM currentproc = 0;



void iterproc(contain* cn)

{

  gh_call1(currentproc, cn->content);

}



SCM_PROC(s_for_each_word, "for-each-word", 2, 0, 0, for_each_word);

SCM for_each_word(SCM obj, SCM proc)

{

  SCM lastproc = currentproc;

  if (!TEXTMGRP(obj))

    scm_wrong_type_arg(s_for_each_word, 1, obj);

  if (!TEXTMGR(obj))

    scm_misc_error(s_for_each_word, "Text object is empty", SCM_EOL);

  currentproc = proc;

  TEXTMGR(obj)->foreach(iterproc);

  currentproc = lastproc;

  return SCM_UNSPECIFIED;

}



SCM_PROC(s_for_each_unique_word, "for-each-unique-word", 1, 0, 0, 
for_each_unique_word);

SCM for_each_unique_word(SCM proc)

{

  SCM lastproc = currentproc;

  currentproc = proc;

  TextFile::table.foreach(iterproc);

  currentproc = lastproc;

  return SCM_UNSPECIFIED;

}



SCM_PROC(s_lookup_word, "lookup-word", 1, 0, 0, lookup_word);

SCM lookup_word(SCM obj)

{

  contain* cn;

  if (scm_string_p(obj) != SCM_BOOL_T)

    scm_wrong_type_arg(s_lookup_word, 1, obj);

  cn = TextFile::table.get(SCM_CHARS(obj));

  if (cn)

    return cn->content;

  else

    return SCM_BOOL_F;

}



SCM_PROC(s_create_word, "create-word", 0, 0, 1, create_word);

SCM create_word(SCM args)

{

  SCM obj;

  contain* cn;

  if (scm_ilength(args) < 1)

    scm_wrong_num_args(scm_makfrom0str(s_create_word));

  obj = SCM_CAR(args);

  if (scm_string_p(obj) != SCM_BOOL_T)

    scm_wrong_type_arg(s_create_word, 1, obj);

  cn = TextFile::table.insert(SCM_CHARS(obj));

  cn->refcount += 2;

  SCM_SETCDR(cn->content, SCM_CDR(args));

  return cn->content;

}



SCM_PROC(s_check_text_sections, "check-text-sections", 1, 0, 0, 
check_text_sections);

SCM check_text_sections(SCM tag)

{

  if (tag == SCM_BOOL_F) {

    TextFile::CheckNewline = 0;

  } else if (tag == SCM_BOOL_F) {

    TextFile::CheckNewline = 1;

  } else if (scm_string_p(tag) == SCM_BOOL_T) {

    TextFile::CheckNewline = 1;

    TextFile::CheckNewlineResult = strcpy(new char[strlen(SCM_CHARS(tag))], 
SCM_CHARS(tag));

  } else

    scm_wrong_type_arg(s_check_text_sections, 1, tag);

  return SCM_UNSPECIFIED;

}



static SCM globalport;



void csave(contain* cn)

{

  scm_write(cn->content, globalport);

  scm_newline(globalport);

}



SCM cread()

{

  SCM res;

  res = scm_read(globalport);

  if (res == SCM_EOF_VAL || !SCM_CONSP(res) ||

      scm_string_p(SCM_CAR(res)) != SCM_BOOL_T)

    return SCM_BOOL_F;

  else

    return res;

}



SCM_PROC(s_export_words, "export-words", 1, 0, 0, export_words);

SCM export_words(SCM obj)

{

  if (scm_string_p(obj) != SCM_BOOL_T)

    scm_wrong_type_arg(s_export_words, 1, obj);

  globalport = scm_open_file(obj, scm_makfrom0str("w"));

  scm_protect_object(globalport);

  TextFile::table.foreach(csave);

  scm_close_port(globalport);

  scm_unprotect_object(globalport);

  return SCM_UNSPECIFIED;

}



SCM_PROC(s_import_words, "import-words", 1, 0, 0, import_words);

SCM import_words(SCM obj)

{

  SCM ele;

  if (scm_string_p(obj) != SCM_BOOL_T)

    scm_wrong_type_arg(s_import_words, 1, obj);

  globalport = scm_open_file(obj, scm_makfrom0str("r"));

  scm_protect_object(globalport);

  while ((ele = cread()) != SCM_BOOL_F)

    SCM_SETCDR(TextFile::table.insert(SCM_CHARS(SCM_CAR(ele)))->content,

               SCM_CDR(ele));

  scm_close_port(globalport);

  scm_unprotect_object(globalport);

  return SCM_UNSPECIFIED;

}



void init_gltext()

{

  scm_tc16_textmgr = scm_make_smob_type("textmgr", 0);

  scm_set_smob_mark(scm_tc16_textmgr, mark_textmgr);

  scm_set_smob_free(scm_tc16_textmgr, free_textmgr);

  scm_set_smob_print(scm_tc16_textmgr, print_textmgr);

#include "gltext.x"

}



-------------------------------------------------------------------------------------

#include <guile/gh.h>

...



void main2(int argc, char** argv)

{

...



  scm_eval_0str("(define-module (guile) :use-module (ice-9 readline))"); 

  scm_eval_0str("(define-module (guile-user) :use-module (ice-9 readline))"); 

  scm_eval_0str("(activate-readline)"); 

  scm_eval_0str("(set-repl-prompt! \"gsdm> \")");

  scm_shell (argc, argv);

}



int main(int argc, char** argv)

{

  gh_enter(argc, argv, main2);

  return 0;

}

_______________________________________________
Join Excite! - http://www.excite.com
The most personalized portal on the Web!






reply via email to

[Prev in Thread] Current Thread [Next in Thread]