/*! \brief Read attributes from a buffer. * \par Function Description * Read attributes from a TextBuffer. * * \param [in] toplevel The TOPLEVEL object. * \param [in] object_to_get_attribs Object which gets these attribs. * \param [in] tb The text buffer to read from. * \param [in] release_ver libgeda release version number. * \param [in] fileformat_ver file format version number. * \return GList of attributes read, or NULL on error. */ GList *o_read_attribs (TOPLEVEL *toplevel, OBJECT *object_to_get_attribs, TextBuffer *tb, unsigned int release_ver, unsigned int fileformat_ver, GError ** err) { GList *object_list = NULL; OBJECT *new_obj; const char *line = NULL; char objtype; int ATTACH=FALSE; while (1) { line = s_textbuffer_next_line (tb); if (line == NULL) break; sscanf(line, "%c", &objtype); switch (objtype) { case(OBJ_LINE): if ((new_obj = o_line_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_NET): if ((new_obj = o_net_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_BUS): if ((new_obj = o_bus_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_BOX): if ((new_obj = o_box_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_CIRCLE): if ((new_obj = o_circle_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_COMPLEX): case(OBJ_PLACEHOLDER): if ((new_obj = o_complex_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_PATH): new_obj = o_path_read (toplevel, line, tb, release_ver, fileformat_ver, err); if (new_obj == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_PIN): if ((new_obj = o_pin_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_ARC): if ((new_obj = o_arc_read (toplevel, line, release_ver, fileformat_ver, err)) == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_TEXT): new_obj = o_text_read (toplevel, line, tb, release_ver, fileformat_ver, err); if (new_obj == NULL) goto error; object_list = g_list_prepend (object_list, new_obj); ATTACH=TRUE; break; case(ENDATTACH_ATTR): return object_list; break; } if (ATTACH) { o_attrib_attach (toplevel, new_obj, object_to_get_attribs, FALSE); ATTACH=FALSE; } else { g_set_error(err, EDA_ERROR, EDA_ERROR_PARSE, _("Tried to attach a non-text item as an attribute")); goto error; } } /* The attribute list wasn't terminated, so it's a parse error! */ g_set_error (err, EDA_ERROR, EDA_ERROR_PARSE, _("Unexpected end-of-file in attribute list")); error: s_delete_object_glist(toplevel, object_list); return NULL; }
/*! \brief Read attributes from a buffer. * \par Function Description * Read attributes from a TextBuffer. * * \param [in] toplevel The TOPLEVEL object. * \param [out] list Storage for attributes. * \param [in] object_to_get_attribs Object which gets these attribs. * \param [in] tb The text buffer to read from. * \param [in] release_ver libgeda release version number. * \param [in] fileformat_ver file format version number. * \return GList of attributes read. */ GList *o_read_attribs (TOPLEVEL *toplevel, GList *list, OBJECT *object_to_get_attribs, TextBuffer *tb, unsigned int release_ver, unsigned int fileformat_ver) { GList *object_list; OBJECT *new_obj; char *line = NULL; char objtype; int ATTACH=FALSE; object_list = g_list_reverse (list); while (1) { line = s_textbuffer_next_line (tb); if (line == NULL) break; sscanf(line, "%c", &objtype); switch (objtype) { case(OBJ_LINE): new_obj = o_line_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_NET): new_obj = o_net_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_BUS): new_obj = o_bus_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_BOX): new_obj = o_box_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_CIRCLE): new_obj = o_circle_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_COMPLEX): case(OBJ_PLACEHOLDER): new_obj = o_complex_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_PATH): line = g_strdup (line); new_obj = o_path_read (toplevel, line, tb, release_ver, fileformat_ver); g_free (line); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_PIN): new_obj = o_pin_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_ARC): new_obj = o_arc_read (toplevel, line, release_ver, fileformat_ver); object_list = g_list_prepend (object_list, new_obj); break; case(OBJ_TEXT): line = g_strdup (line); new_obj = o_text_read (toplevel, line, tb, release_ver, fileformat_ver); g_free (line); object_list = g_list_prepend (object_list, new_obj); ATTACH=TRUE; break; case(ENDATTACH_ATTR): object_list = g_list_reverse (object_list); return(object_list); break; } if (ATTACH) { o_attrib_attach (toplevel, new_obj, object_to_get_attribs, FALSE); ATTACH=FALSE; } else { fprintf(stderr, "Tried to attach a non-text item as an attribute\n"); } } object_list = g_list_reverse (object_list); return(object_list); }