summary refs log tree commit diff stats
path: root/lib/pure/math.nim
Commit message (Expand)AuthorAgeFilesLines
* Fix the broken link in math.nim (#11653) [ci skip]Graeme Cross2019-07-041-1/+1
* [documentation] fix #4630, document unsupported functions for JSnarimiran2019-06-241-0/+8
* Add `cbrt()` bindings for the JS Target (#11528)Benjamin Summerton2019-06-181-0/+3
* Render deprecated pragmas (#8886)LemonBoy2019-06-031-13/+7
* stdlib: more consistent formattingAraq2019-05-221-5/+5
* fix #10910, optimize squaring and cubing (#11291)Miran2019-05-211-16/+21
* code cleanup (#10874)Arne Döring2019-03-281-6/+4
* 32 bit fixes (#10608)Arne Döring2019-02-131-1/+1
* Genode fixes (#10491)Emery Hemingway2019-01-291-1/+1
* documentation: remove author field [ci skip]narimiran2019-01-171-3/+0
* better docs: mathnarimiran2019-01-161-97/+420
* Resolve things raised in https://github.com/nim-lang/Nim/issues/10081 ? (#10084)c-blake2018-12-311-0/+18
* Fix #9585 hypot in jsB3liever2018-10-311-1/+2
* more examples for mod and div, plus corrections [ci skip]narimiran2018-10-281-8/+46
* Documentation improved for `math` module (#9266)eqperes2018-10-101-79/+171
* fix for #9082 (#9089)Arne Döring2018-10-091-14/+16
* math.nim: document what to use instead of 'fmod'Araq2018-09-251-2/+2
* fixes 8594 (#8721)cooldome2018-08-221-1/+1
* Merge pull request #8628 from hlaaftana/patch-1Dominik Picheta2018-08-141-2/+2
|\
| * Small documentation typo in mathhlaaf2018-08-141-2/+2
* | Haiku support for Nim (#8542)alaviss2018-08-141-1/+1
|/
* fixes #8421, fixes #7968, Nim compiler compiles with MSVC C89 version (#8556)andri lim2018-08-071-24/+58
* Merge pull request #7950 from Paalon/math-logAndreas Rumpf2018-06-141-5/+15
|\
| * Fix a testKoki Fushimi2018-06-141-1/+1
| * Use one same type for two parametersKoki Fushimi2018-06-141-5/+1
| * Use concrete expressionKoki Fushimi2018-06-051-7/+6
| * Bug fixKoki Fushimi2018-06-051-2/+3
| * Change to use log(x, base)Koki Fushimi2018-06-051-3/+3
| * Broaden the argument typesKoki Fushimi2018-06-041-1/+6
| * Generalize and add testKoki Fushimi2018-06-041-7/+14
| * Add log proc for base b of xKoki Fushimi2018-06-041-1/+3
* | Rename tgamma to gamma (#7929)Koki Fushimi2018-06-051-3/+10
* | Add product proc (#7951)Koki Fushimi2018-06-041-1/+13
|/
* Removed spaces in math moduledata-man2018-05-301-1/+1
* Use truncation division in mod for floats (#7118)Oscar Nihlgård2018-05-301-11/+40
* Add inverse hyperbolic, and cot, sec and csc; and their hyperbolic, inverse, ...Koki Fushimi2018-05-301-61/+96
* Faster binary gcd algorithm (#7849)Koki Fushimi2018-05-261-2/+30
* Fixes factorial's bugdata-man2018-05-171-1/+12
* Replace factorial function with a compile time one (#7276)notTito2018-05-041-4/+14
* fixes #6353 (#6951)skilchen2017-12-211-4/+13
* add missing math.trunc for js backend (#6950)skilchen2017-12-201-0/+2
* Add hint about computing powers between integers (#6419)Federico Ceratto2017-10-161-0/+2
* fixes #5966Fabian Keller2017-06-201-4/+7
* Add sgn() function to the math module (#5971)John Novak2017-06-151-0/+25
* bcc misses the same functions like vccAdrianV2016-12-281-1/+1
* Fixed #4532, VS2010 now can compile Nimandri lim2016-08-081-7/+86
* Removed trailing whitespace in math moduleMathijs Saey2016-08-051-1/+1
* Fixed #4574Mathijs Saey2016-08-051-1/+1
* Corrected comment in maths library.A. S. Budden2016-06-201-1/+1
* Update math.nimmatkuki2016-06-181-1/+1
n>"prof_config.h" #include <assert.h> #include <stdlib.h> #include <string.h> #include <glib.h> #ifdef PROF_HAVE_LIBMESODE #include <mesode.h> #endif #ifdef PROF_HAVE_LIBSTROPHE #include <strophe.h> #endif #include "log.h" #include "plugins/plugins.h" #include "profanity.h" #include "ui/ui.h" #include "event/server_events.h" #include "event/client_events.h" #include "tools/autocomplete.h" #include "config/preferences.h" #include "xmpp/connection.h" #include "xmpp/roster.h" #include "roster_list.h" #include "xmpp/stanza.h" #include "xmpp/xmpp.h" #define HANDLE(type, func) xmpp_handler_add(conn, func, XMPP_NS_ROSTER, STANZA_NAME_IQ, type, ctx) // callback data for group commands typedef struct _group_data { char *name; char *group; } GroupData; // event handlers static int _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); // id handlers static int _group_add_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _group_remove_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); // helper functions GSList* _get_groups_from_item(xmpp_stanza_t *item); void roster_add_handlers(void) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); HANDLE(STANZA_TYPE_SET, _roster_set_handler); HANDLE(STANZA_TYPE_RESULT, _roster_result_handler); } void roster_request(void) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_roster_iq(ctx); xmpp_send(conn, iq); xmpp_stanza_release(iq); } void roster_send_add_new(const char *const barejid, const char *const name) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); char *id = create_unique_id("roster"); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, id, barejid, name, NULL); free(id); xmpp_send(conn, iq); xmpp_stanza_release(iq); } void roster_send_remove(const char *const barejid) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_roster_remove_set(ctx, barejid); xmpp_send(conn, iq); xmpp_stanza_release(iq); } void roster_send_name_change(const char *const barejid, const char *const new_name, GSList *groups) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); char *id = create_unique_id("roster"); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, id, barejid, new_name, groups); free(id); xmpp_send(conn, iq); xmpp_stanza_release(iq); } void roster_send_add_to_group(const char *const group, PContact contact) { GSList *groups = p_contact_groups(contact); GSList *new_groups = NULL; while (groups) { new_groups = g_slist_append(new_groups, strdup(groups->data)); groups = g_slist_next(groups); } new_groups = g_slist_append(new_groups, strdup(group)); // add an id handler to handle the response char *unique_id = create_unique_id(NULL); GroupData *data = malloc(sizeof(GroupData)); data->group = strdup(group); if (p_contact_name(contact)) { data->name = strdup(p_contact_name(contact)); } else { data->name = strdup(p_contact_barejid(contact)); } xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_id_handler_add(conn, _group_add_handler, unique_id, data); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact), p_contact_name(contact), new_groups); xmpp_send(conn, iq); xmpp_stanza_release(iq); free(unique_id); } static int _group_add_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata) { if (userdata) { GroupData *data = userdata; ui_group_added(data->name, data->group); free(data->name); free(data->group); free(userdata); } return 0; } void roster_send_remove_from_group(const char *const group, PContact contact) { GSList *groups = p_contact_groups(contact); GSList *new_groups = NULL; while (groups) { if (strcmp(groups->data, group) != 0) { new_groups = g_slist_append(new_groups, strdup(groups->data)); } groups = g_slist_next(groups); } xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); // add an id handler to handle the response char *unique_id = create_unique_id(NULL); GroupData *data = malloc(sizeof(GroupData)); data->group = strdup(group); if (p_contact_name(contact)) { data->name = strdup(p_contact_name(contact)); } else { data->name = strdup(p_contact_barejid(contact)); } xmpp_id_handler_add(conn, _group_remove_handler, unique_id, data); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact), p_contact_name(contact), new_groups); xmpp_send(conn, iq); xmpp_stanza_release(iq); free(unique_id); } static int _group_remove_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata) { if (userdata) { GroupData *data = userdata; ui_group_removed(data->name, data->group); free(data->name); free(data->group); free(userdata); } return 0; } static int _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata) { xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY); xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(query, STANZA_NAME_ITEM); if (item == NULL) { return 1; } // if from attribute exists and it is not current users barejid, ignore push Jid *my_jid = jid_create(jabber_get_fulljid()); const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); if (from && (strcmp(from, my_jid->barejid) != 0)) { jid_destroy(my_jid); return 1; } jid_destroy(my_jid); const char *barejid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID); gchar *barejid_lower = g_utf8_strdown(barejid, -1); const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME); const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION); const char *ask = xmpp_stanza_get_attribute(item, STANZA_ATTR_ASK); // do not set nickname to empty string, set to NULL instead if (name && (strlen(name) == 0)) { name = NULL; } // remove from roster if (g_strcmp0(sub, "remove") == 0) { // remove barejid and name if (name == NULL) { name = barejid_lower; } roster_remove(name, barejid_lower); ui_roster_remove(barejid_lower); // otherwise update local roster } else { // check for pending out subscriptions gboolean pending_out = FALSE; if (ask && (strcmp(ask, "subscribe") == 0)) { pending_out = TRUE; } GSList *groups = _get_groups_from_item(item); // update the local roster PContact contact = roster_get_contact(barejid_lower); if (contact == NULL) { gboolean added = roster_add(barejid_lower, name, groups, sub, pending_out); if (added) { ui_roster_add(barejid_lower, name); } } else { sv_ev_roster_update(barejid_lower, name, groups, sub, pending_out); } } g_free(barejid_lower); return 1; } static int _roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata) { const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID); if (g_strcmp0(id, "roster") != 0) { return 1; } // handle initial roster response xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY); xmpp_stanza_t *item = xmpp_stanza_get_children(query); while (item) { const char *barejid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID); gchar *barejid_lower = g_utf8_strdown(barejid, -1); const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME); const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION); // do not set nickname to empty string, set to NULL instead if (name && (strlen(name) == 0)) name = NULL; gboolean pending_out = FALSE; const char *ask = xmpp_stanza_get_attribute(item, STANZA_ATTR_ASK); if (g_strcmp0(ask, "subscribe") == 0) { pending_out = TRUE; } GSList *groups = _get_groups_from_item(item); gboolean added = roster_add(barejid_lower, name, groups, sub, pending_out); if (!added) { log_warning("Attempt to add contact twice: %s", barejid_lower); } g_free(barejid_lower); item = xmpp_stanza_get_next(item); } sv_ev_roster_received(); return 1; } GSList* _get_groups_from_item(xmpp_stanza_t *item) { GSList *groups = NULL; xmpp_stanza_t *group_element = xmpp_stanza_get_children(item); while (group_element) { if (strcmp(xmpp_stanza_get_name(group_element), STANZA_NAME_GROUP) == 0) { char *groupname = xmpp_stanza_get_text(group_element); if (groupname) { groups = g_slist_append(groups, groupname); } } group_element = xmpp_stanza_get_next(group_element); } return groups; }